Android平台下的JNI开发

摘要:
要用JNI首先必须安装Android的NDK,配置好NDK环境之后就可以在Eclipse下进行C/C++开发了。下面以C++为例一步一步说明JNI开发过程。1创建Android工程新建一个TestJNI目录,用Eclipse在该目录下创建一个名为TestJNI的Android工程,包名为com.TestJNI.jni。下面我们就来实现CAdd类和JNI接口。先在工程目录的jni下创建一个Android.mk文件:然后打开文件在里面输入如下内容:其中LOCAL_PATH是C/C++代码所在目录,也就是我们的jni目录。

JNI是Java Native Interface的缩写,通过JNI可以方便我们在Android平台上进行C/C++编程。要用JNI首先必须安装Android的NDK,配置好NDK环境之后就可以在Eclipse下进行C/C++开发了。

其实JNI的原理很容易理解,其本质就是在Java层定义一个接口,同时在C层用C/C++代码实现该接口的功能并编译成动态链接库,这样 Activity就可以通过Java层接口调用生成的动态链接库,完成相应的功能。简单地说就是两点:(1)定义Java接口(JNI),(2)用 C/C++实现接口功能并打包成库文件以供调用。

在这里,我将假设读者已经在Linux环境下安装好了NDK,并且会使用Eclipse。下面以C++为例一步一步说明JNI开发过程。

1 创建Android工程

新建一个TestJNI目录,用Eclipse在该目录下创建一个名为TestJNI的Android工程,包名为com.TestJNI.jni。创建完成后在工程的src目录下会自动创建一个名为TestJNIActivity.java的文件。
【笔记】Android平台下的JNI开发

2 设计Java接口
先不用管这个文件,在该文件的位置再创建一个名为TestJNI.java文件:

【笔记】Android平台下的JNI开发

打开TestJNI.java,我们将在这个文件里创建一个JNI接口类,该Java类提供一个加法运算的接口:
【笔记】Android平台下的JNI开发
这里的函数声明一定要加native修饰。

3编译JNI

将TestJNI.java文件复制到工程的bin目录下,在终端中进入该工程的bin目录,输入javac TestJNI.java,这时会生成一个TestJNI.class文件。

【笔记】Android平台下的JNI开发
在bin文件夹下,如果没有则创建目录:/com/TestJNI/jni,并把TestJNI.class复制到/bin/com/TestJNI/jni目录下。然后在终端里进入工程的bin目录,输入javah -jni com.TestJNI.jni.TestJNI,此时会生成一个com_TestJNI_jni_TestJNI.h文件。

【笔记】Android平台下的JNI开发
com_TestJNI_jni_TestJNI.h文件就是对应于上面定义的Java接口的C/C++头文件。打开这个文件,可以看到系统已经为我们自动完成了接口函数的声明:

【笔记】Android平台下的JNI开发
这三个函数分别对应于JNI的三个接口函数,命名方式只是在前面加上了Java包名。

4 用C/C++实现JNI

有了JNI的C/C++头文件,就可以在C层实现JNI接口了。首先在工程目录下创建一个jni目录,这个目录就是专门用来放C/C++代码的。把com_TestJNI_jni_TestJNI.h文件复制到jni目录下,并在这里创建一个com_TestJNI_jni_TestJNI.cpp文件。

由于我想用C++来实现JNI,所以上面两个文件我只是用来作为动态链接库的接口,具体的实现我希望放在一个类里面来完成,因此我再添加两个文件:Add.h和Add.cpp。

【笔记】Android平台下的JNI开发
下面我们就来实现CAdd类和JNI接口。首先实现CAdd类:

Add.h

【笔记】Android平台下的JNI开发

Add.cpp

【笔记】Android平台下的JNI开发
然后我们来写com_TestJNI_jni_TestJNI.cpp,实现JNI:

【笔记】Android平台下的JNI开发

到此我们的C/C++部分就全部实现了。
5创建mk文件

JNI实现了之后就要把C/C++代码编译成动态链接库.so文件,这样Java程序才能调用JNI的接口。要编译so文件,需要写Android.mk和Application.mk两个文件。我们先来写Android.mk。

先在工程目录的jni下创建一个Android.mk文件:

【笔记】Android平台下的JNI开发
然后打开文件在里面输入如下内容:

【笔记】Android平台下的JNI开发
其中LOCAL_PATH是C/C++代码所在目录,也就是我们的jni目录。

LOCAL_MODULE是要编译的库的名称。编译器会自动在前面加上lib,在后面加上.so。

LOCAL_SRC_FILES是要编译的C/C++文件。

现在我们在工程的根目录下创建一个Application.mk文件,并输入如下内容:

【笔记】Android平台下的JNI开发
6 编译动态链接库

写完了mk文件就可以开始编译C/C++代码了。在终端里进入工程的根目录,输入ndk-build即可:

【笔记】Android平台下的JNI开发
编译成功后会在工程目录的libs/armeabi目录下生成一个libTestJNI.so文件。

7 在Java中调用JNI

大家应该还记得在创建工程的时候就已经生成了一个TestJNIActivity.java文件吧。现在打开这个文件,我们来对它进行一点修改,添加我们调用JNI计算加法的代码,如下:
【笔记】Android平台下的JNI开发
在这里我们首先用System.loadLibrary("TestJNI")加载了C/C++编译的so文件,然后创建了一个TestJNI对象,通过 该对象调用了so库中的方法。现在的代码应该是编译不过去的,因为我们还没有给TextView添加ID,所以R.id.tv是无效的。那么我们来添加这 个ID。找到res/layout目录下的main.xml文件:

【笔记】Android平台下的JNI开发

双击打开该文件,在TextView标签下添加一行android:id="@+id/tv",这样就创建了一个名为tv的域并自动分配ID,如下图:

【笔记】Android平台下的JNI开发
现在编译工程,就可以顺利通过了。程序运行结果如下:

【笔记】Android平台下的JNI开发

这个例子只是为了显示JNI的用法,只要写好了JNI接口,其他的编程就跟C/C++一样了。编译动态链接库的时候,除了使用ndk-build命令之外,也可以在Eclipse工程中配置一个Builder,直接在Eclipse下编译。

免责声明:文章转载自《Android平台下的JNI开发》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇cmd命令下载maven管理需要的依赖jar包layer.js 注册登录切换的问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

jmeter处理加密接口

jmeter处理加密接口 普及知识点: 我们常见的加密方式有:(RSA 、AES、MD5、secret) 如下四种情况: 1、请求加密、响应加密        2、请求不加密、响应加密        4、请求加密、响应不加密        5、请求不加密、响应不加密...

C#中将DLL文件打包到EXE文件

1:在工程目录增加dll目录,然后将dll文件复制到此目录,例如: 2:增加引用,定位到工程的dll目录,选中要增加的dll文件 3:修改dll文件夹下面的dll文件属性 选中嵌入式资源,不复制。 4:增加dll加载代码 static classProgram { /// <summary>...

将Eclipse代码导入到AndroidStudio的两种方式

说到使用AndroidStudio,除了新建的项目,我们都会面临的问题是原先Eclipse的代码该怎么导入到AndroidStudio中使用。这方面相关的资料还比较少,自己摸索了一下,总结出这篇博客,希望能让开发者少走些弯路。OK,进入正题。 Google为了让我们更加方便的使用AndroidStudio,提供了两种导入Eclipse代码的方式:一种兼容...

uniAPP Android平台完整更新与热更新

一、概述 1.uni-app打包成apk或wgt文件,使用plus.runtime.getProperty方法获取本地应用资源版本号。2.调用后端接口,拿到与后端规定好的版本号,与前面获取的版本号进行对比,如果不一致(也可以判断当前版本号是否小于线上版本号,也就是最新版本号),进行下一步操作。3.uni.showModal或其他弹出框弹出下载提示。4.使用...

浅析接口测试

接口测试是一种测试类型,又是一种测试方法,它是很多个领域测试工作的一部分,同时它又可以通过不同方式来执行; 功能测试 功能测试即我们常说的黑盒测试,传统意义上的黑盒测试即验证开发出来的产品是否满足产品提出的产品需求说明书,而接口实际上也是产品需求的一部分;例如:产品需求:客户端输入一个词,点击按钮,即按时间倒叙展示这个词相关的新闻;功能实现:客户端将用户输...

App接口如何保证安全

微信开发或者高德地图,百度地图什么的api要使用,使用之前都需要注册一个账号,然后系统会给你一个key,然后调用api的时候把key传给服务器。 平常公司内部开发项目时,直接用mvc为app客户端提供接口,没有做过验证。 本次为了安全,所以需要考虑解决下安全问题。咨询了同学,有人提出,自己定义一个加密字符串+实时的一个时间戳,对称加密。app每次请求接口,...