Android JNI的使用 显示Hello Word

来源:互联网 发布:汤敏的淘宝店网址 编辑:程序博客网 时间:2024/06/03 19:48

今天实现了简单的jni demo,大致流程如下:

1.定义 native 方法,并加载动态链接库

2.利用javah 生成.h的头文件

3.根据头文件编写c/c++程序

4.利用NDK编译并生成.so文件

5.运行程序,成功。

下边通过图文加以说明

第一步

使用java编写显示java的HelloWord程序:


在MainActivity中调用定义的函数,将结果显示到TextView上:

第二步

利用javah命令生成头文件

执行完此命令会在src目录下生成对应的.h文件


打开生成的.h文件:


注意:使用javah 命令的时候可能会出现找不到类,此时要使用javah -classpath . JNIDemo

说明:JNIEXPORT和JNICALL都是JNI的关键字,表示此函数要被JNI所调用,jstring是以JNI为中介使java的string类型与本地的string类型沟通的类型,我们可以看做string类型使用,Java_com_example_myjnis_JNIDemo_SayHello是函数名,它是有java+package路径+接口名组成。方法中带有两个参数,第一个参数是指向JNIEnv的指针,第二个参数为当前对象,即this指针。

第三步

1.在eclipse中右键project->Android Tools->Add Native Support...,如果没有添加NDK的路径,下边的对话框就会出现提示错误(NDK location not valid in Perference),所以首先得添加NDK的路径(Window->Perference->Android->NDK,然后在对话框中写入ndk的路径就行)(NDK需要自己去下载https://developer.android.google.cn/ndk/downloads/index.html,由于ADT现在已经不更新,所以建议大家不要在eclipse上使用最新的NDK,可能会出现“NOt a Valide NDK directory”),NDK配置好了以后,在输入框中输入so的文件名,也就是在System.loadLibrary()中定义的,这块一定要统一!


完后以上工作后,会自动生成jni的文件夹,里边自动生成Android.mk和MyJNIS.cpp两个文件,如下图:

由于我是使用c来实现的,因此将写好的c程序替换生成的MyJNIS.cpp文件,并将.h文件复制到jni文件夹底下(如果出现错误,那么可能 是由于jni.h没有导入,解决办法:
   Project Properties -> C/C++ General -> Path and Symbols选择include标签

   Add ->$Android_NDK_HOME/platforms/android-14/arch-arm/usr/include即可。

):



2.使用c/c++实现头文件中的函数,这里以c程序示例:

说明:头文件中必须包含#include <jni.h> 和 #include "com_example_myjnis_JNIDemo.h"。,否则会显示找不到JNIEXPORT和JNICALL的资源和找不到方法名。

           以上C代码就是实现返回一个字符类型的数据,字符参数为"Hello Word!".

3.将c程序 编译成动态链接库

(1)编写Android.mk文件

如果想在多个平台上生成so文件,那么需要添加Application.mk文件,如果没有该文件,那么只会在armeabi目录下生成so文件,在jni目录下添加Application.mk文件只需要写入APP_ABI := all  即可。

(2)使用NDK编译

进入到project的jni目录,执行ndk-build:

刷新项目后可以看到在libs目录下生成了多个平台的so文件:

注意:网上好多文章都说windows下需要CygWin来编译NDK,经过验证确实通过Cygwin+NDK可以编译成功:

运行Cygwin,进入到jni目录,输入ndk-build可以编译生成so库

而直接使用NDK也可以编译生成so库,查看NDK的api


发现,在NDK Revision 7中已经支持了可以不在使用CygWine就可以编译so库。

第四步

大功告成,现在可以看到 java 使用jni调用c/c++的结果:


     



原创粉丝点击