1. 介绍
应用程序时常需要调用 C 库,并通过 apk 包安装到系统当中。我们可以通过 NDK 来安装库,如果你有源代码开发环境,可以通过 Android.mk 脚本很简单地将 java 程序和 c 库放在一个项目中编译和安装。
2. 原理
利用在 Android.mk 中加 LOCAL_JNI_SHARED_LIBRARIES 指定安装库
3. 例程
1) 功能
将加法用 c 语言实现,并编成 so 库,在 Java 层通过 JNI 方式调用它,并将界面和库打成一个 apk 包安装
2) 可从此处下载可独立运行的代码
http://download.youkuaiyun.com/source/2841528
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