Android JNI实例

andriod的SDK 中没有包括 JNI 的支持,而且对如何支持 JNI 也没有任何文档说明。不过既然整个android平台 是开源的,我们可以通过 Google 发布的源代码来找到一些线索(比如 frameworks/base/media/jni/ 目录),依葫芦画瓢的实现上层 JAVA 程序通过 JNI 来调用 Native C 程序中的函数。

 

依照下面的步骤可以实现一个非常简单的 JNI 的实例程序:

 

1.  首先编写 C 模块,实现动态库。(关于如何在 Android 中编译 C 模块的更多细节,请参考《Android编译Native C 模块 》。)

development 目录下添加新目录 hellolib ,并添加 hellolib.c Android.mk 文件。 hellolib.c 的内容如下:


注意这里的函数名需要按照 JNI 的规范(因此也可以用 javah -jni 工具来生成头文件,来保证函数名的正确性).

Java_com_test_TestHelloLib_printHello 的命名对应后面在 java 代码中, package 名字是 com.test ,类名是 TestHelloLib native 函数名是 printHello

另外, LOGD #define LOG_TAG "TestLib" 等打印 log 的方式是采用了 Android 所提供的 LOG 机制,这样才能通过 Android logcat 工具看到 log

用于编译 C 模块的 Android.mk 文件内容如下:


该文件中的一些变量分别对应的含义如下:

LOCAL_SRC_FILES 编译的源文件

LOCAL_C_INCLUDES 需要包含的头文件目录

LOCAL_SHARED_LIBRARIES 链接时需要的外部库

LOCAL_PRELINK_MODULE 是否需要 prelink 处理(参考 prelink 的详细介绍:《 动态库优化 ——Prelink(预连接)技术 》, Android Toolchain, prelink 工具:《 Android Toolchain Bionic Libc

LOCAL_MODULE 编译的目标对象

BUILD_SHARED_LIBRARY 指明要编译成动态库。

 


       接下来回到 Android 顶层目录,并执行 make libhello 来编译:


       编译结果可得到位于 out/target/product/generic/system/lib/ 目录的动态共享库 libhello.so

 

2 .编写 Java 模块,来通过 JNI 方式调用 C 接口。具体 Eclipse 环境的搭建请参考 Android SDK 文档中的详细说明,及 Hello Android 程序的创建过程,这里仅给出我们需要修改的 TestHelloLib.java 文件:


注意上面代码部分: private native void printHello() 用来声明一个 native 接口;

static {

    System.loadLibrary("hello");

}

用来加载上面步骤中生成 libhello.so (注意 loadLibrary 方法的参数不是 ”libhello.so” ,而是去掉前缀和后缀之后的 ”hello” ), onCreate() 方法中则调用了 printHello() 接口。

    通过这一步骤可生成 Android 开发者所熟悉的 apk 文件: TestHelloLib.apk

 

3 .集成测试 TestHelloLib.apk libhello.so 。先运行 emulator 并将 TestHelloLib.apk libhello.so 上传至 emulator 中。注意要将 libhello.so 上传到 emulator /system/lib 目录,由于该目录是只读的,上传之前先要执行 adb remount


       接下来在模拟器菜单中可以看到已经安装的 TestHelloLib 程序,运行即可。

       由于 JNI 接口 printHello() 并没有作界面上的改动,要验证其效果需要用 Android logcat 工具来查看。运行 ”adb logcat” 可以找到下面的 log 片断:


       这里包含了调用 printHello() 接口的 log 信息,其中 D/TestLib (  174): Hello LIB!” 就是 printHello() 所打印的信息。至此成功完成 Android JNI 的实例验证。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值