【Android】Android中使用JNI调用底层C++代码

Android NDK是一系列工具的集合。帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。NDK集成了交叉编译器,并提供了相应的mk文件隔离平台、CPU、API等差异,只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so动态链接库文件
JNI编译环境配置 有2种方式来实现编译jni工程:
方法一:
在ADT的菜单windows->preferences->Android->NDK设置NDK的路径,同时在工程的属性中,选择默认ndk编译。
方法二:
在ADT的菜单windows,属性,build中设置NDK的路径。同时在系统环境变量中配置NDK_ROOT以及路径,然后在工程的属性中,不选择默认NDK,输入编译指令
这里按第一种方式来配置JNI的编译环境:
先下载NDK,然后解压。下载链接:
http://pan.baidu.com/s/1o6OnOp0
设置过程如下图所示:

配置NDK的路径为解压路径即可
示例工程建立 创建JNI的接口类
接口类的位置在src目录下的任意一个包中

package com.example.testndk01; public class JniClient {static public native String getName(); }

编译接口类
进入项目文件夹, 生成JNI的头文件, 使用如下的编译命令:
javah -classpath bin/classes -d jni com.example.testndk01.JniClient
也可以直接到工程的classes目录下使用 javah -d jni com.example.testndk01.JniClient 编译
编译完成之后会生成一个com_example_testndk01_JniClient.h头文件,该头文件是根据JniClient.java文件生成的,该文件中含有native方法。
配置Android项目的NativeSupport
右键工程->Android Tools,点击Add NativeSupport,输入一个文件名,之后会生成jni文件夹和两个新的文件。这里生成的是TestNDK01.cpp文件和Android.mk,TestNDK01.cpp文件是和com_example_testndk01_JniClient.h头文件对应的一个C++实现。Android.mk文件是一个Makefile文件,IDE自动生成的,可以不用修改。
添加Native方法的C++实现
直接返回一个字符串
#include #include JNIEXPORT jstring JNICALL Java_com_example_testndk01_JniClient_getName (JNIEnv *env, jclass) { return env->NewStringUTF("just a NDK test"); }

添加实现方法的时候.h文件或者.cpp文件可能会出现“Unresolved inclusion jni.h”问题,解决办法参考:
使用编译生成的.so动态链接库文件
在自己的Android应用中加载编译的动态链接库文件,注意不许要添加lib前缀和.so后缀
static { System.loadLibrary("TestNDK01"); }

加载了库文件之后就可以使用C++提供的方法了,这里示例代码的是一个返回字符串函数,如下:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv_name = (TextView) findViewById(R.id.tv_name); tv_name.setText(JniClient.getName()); }

在onCreate方法中,将JniClient中的getName() (该方法的实际实现就是使用底层C++代码实现的)返回的字符串设置到一个textView控件中。
执行结果:

示例工程文件结构如下:

参考:
【【Android】Android中使用JNI调用底层C++代码】http://blog.csdn.net/wangjianzhongfj/article/details/39139497
http://www.cnblogs.com/bastard/archive/2012/05/19/2508913.html

    推荐阅读