0
点赞
收藏
分享

微信扫一扫

典型应用之——将库打进apk


 

1.    介绍
应用程序时常需要调用C库,并通过apk包安装到系统当中。我们可以通过NDK来安装库,如果你有源代码开发环境,可以通过Android.mk脚本很简单地将java程序和c库放在一个项目中编译和安装。

2.    原理
利用在Android.mk中加LOCAL_JNI_SHARED_LIBRARIES指定安装库

3.    例程

1)        功能
将加法用c语言实现,并编成so库,在Java层通过JNI方式调用它,并将界面和库打成一个apk包安装

2)        可从此处下载可独立运行的代码

3)        核心代码及说明

a)         java程序

package com.android.mylib;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class MyLibActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

TextView tv = new TextView(this);
int x = 55;
int y = 8;
int z = 0;

System.loadLibrary("test"); // 装载libtest.so库 z = testme(x, y); // 调用JNI
tv.setText(x + "+" + y + "=" + z);
setContentView(tv);
}

public native int testme(int x, int y); // 声明JNI
}
b) 项层Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := user eng
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := mylib
LOCAL_JNI_SHARED_LIBRARIES := libtest // 安装库
include $(BUILD_PACKAGE)
include $(LOCAL_PATH)/jni/Android.mk // 调用库的编译
include $(call all-makefiles-under,$(LOCAL_PATH))c) jni程序(C程序实现)
#include <jni.h>

JNIEXPORT jint JNICALL Java_com_android_mylib_MyLibActivity_testme
(JNIEnv *env, jobject obj, jint x, jint y) { // JNI的实现 return x + y;
}d) jni层Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

|LOCAL_MODULE_TAGS := user eng
LOCAL_MODULE := libtest

LOCAL_SRC_FILES := jnitest.c
LOCAL_C_INCLUDES += /
$(JNI_H_INCLUDE)
LOCAL_PRELINK_MODULE := false
include $(BUILD_SHARED_LIBRARY) // 编译so库

4)        执行结果
安装apk包后,用adb shell进入手机系统,然后ls /data/data/com.android.mylib/lib/可以看到库被安装到此处

2.    注意
对库进行调试不能adb install -r, 要先uninstall, 否则有时覆盖不了库

3.    参考

1)        c回调java函数,可参数
​​​http://blog.sina.com.cn/s/blog_4b650d650100lw43.html​​

 

举报

相关推荐

0 条评论