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

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.csdn.net/source/2841528

](http://download.csdn.net/source/2841528)

  1. 核心代码及说明
  1. 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
}
  1. 项层 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)) **
  1. 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;
}

  1. 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 ** ** 库 **
  1. 执行结果
    安装 apk 包后,用 adb shell 进入手机系统,然后
1
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

](http://blog.sina.com.cn/s/blog_4b650d650100lw43.html)