典型应用之——将库打进apk
|Word count:473|Reading time:2min|Post View:
典型应用之——将库打进 apk
1. 介绍
应用程序时常需要调用 C 库,并通过 apk 包安装到系统当中。我们可以通过 NDK
来安装库,如果你有源代码开发环境,可以通过
Android.mk 脚本很简单地将 java 程序和 c
库放在一个项目中编译和安装。
2. 原理
利用在 Android.mk 中加 LOCAL_JNI_SHARED_LIBRARIES 指定安装库
3. 例程
功能
将加法用 c 语言实现,并编成 so 库,在 Java 层通过 JNI
方式调用它,并将界面和库打成一个 apk 包安装
可从此处下载可独立运行的代码
[http://download.csdn.net/source/2841528
](http://download.csdn.net/source/2841528)
- 核心代码及说明
- java 程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| 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 }
|
- 项层 Android.mk
1 2 3 4 5 6 7 8 9 10 11
| 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)) **
|
- jni 程序(C 程序实现)
1 2 3 4 5 6 7
| #include <jni.h> JNIEXPORT jint JNICALL Java_com_android_mylib_MyLibActivity_testme (JNIEnv *env, jobject obj, jint x, jint y) { // JNI ** ** 的实现 ** ** return x + y; }
|
- jni 层 Android.mk
1 2 3 4 5 6 7 8 9 10 11 12
| 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 ** ** 库 **
|
- 执行结果
安装 apk 包后,用 adb shell 进入手机系统,然后
1
| ls /data/data/com.android.mylib/lib/
|
可以看到库被安装到此处
2. 注意
对库进行调试不能 adb install -r, 要先 uninstall, 否则有时覆盖不了库
3. 参考
- c 回调 java 函数, 可参数
[http://blog.sina.com.cn/s/blog_4b650d650100lw43.html
](http://blog.sina.com.cn/s/blog_4b650d650100lw43.html)