之前一直都不知怎么编写JNI,今天刚好学习一下,感谢梦真的指教,以及提供的文档。
参考链接
http://blog.csdn.net/u011168565/article/details/51878176
http://www.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html
创建一个jni类(.java文件)
1. 创建Android studio 工程
2. 切换到project视图
3. 创建jni类如下所示
package com.example.tony.jnidemo; /** * Created by Tony on 2016/7/19. */ public class JNITest { public native String getJNIString(); // jni接口函数 static { System.loadLibrary("hello-jni"); //加载jni动态库,只写库名,库名称是在build.gradle中指定的。 } }
生成.class文件
点击导航栏build-> Make Module "app", 编译jni类(.java文件),生成.class文件
生成的.class文件在app/build/intermediates/classes/debug目录中
生成.h文件
1. 打开终端,切换到debug目录
JNIDemo\app\build\intermediates\classes\debug
2. 在debug目录下生成.h文件
在终端输入命令
javah com.example.tony.jnidemo.JNITest //com.example.tony.jnidemo是包名,JNITest是类名;
在debug目录下,生成文件com_example_tony_jnidemo_JNITest.h
编写jni源代码
1. 复制debug目录的.h文件
2. 在app/src/main目录下创建jni目录(一定要是小写的)
3. debug目录中的.h文件粘贴到jni目录中。
4. 在jni目录中创建.c文件,文件名称自己取。
5. 复制.h文件中的内容到.c文件中。并实现其中的函数,如下所示,返回一个jstring类型。
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_example_tony_jnidemo_JNITest */ #ifndef _Included_com_example_tony_jnidemo_JNITest #define _Included_com_example_tony_jnidemo_JNITest #ifdef __cplusplus extern "C" { #endif /* * Class: com_example_tony_jnidemo_JNITest * Method: getJNIString * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_example_tony_jnidemo_JNITest_getJNIString (JNIEnv *env, jobject thisObj) { return (*env)->NewStringUTF(env,"Hello World"); } #ifdef __cplusplus } #endif #endif
配置gradle文件
打开buidle.gradle,添加ndk内容,指定动态库名称和处理器架构
defaultConfig { applicationId "com.example.aplex.jnidemo" minSdkVersion 15 targetSdkVersion 23 versionCode 1 versionName "1.0" ndk{ //在JNI打log 必须加上log,否则会报错log函数未定义, ldLibs "log" //指定生成模块名字,也就是最终的动态库名hello-jni,相应库文件名libhello-jni.so moduleName "hello-jni" moduleName "hello-jni" // 指定生成哪些处理器架构的动态库文件,如果要运行在x86架构处理器一定需要指定 abiFilters "armeabi" , "x86" abiFilters "armeabi" , "x86" } }
添加ndk
打开gradle.properties在文件最后添加。
android.useDeprecatedNdk=true
否者编译会出错。
至此,jni编写完毕,点击导航栏中的图标(Sync Project with Gradle Files),生成gradle文件,就可以调用JNI的类了。
Author
Tony Liu
2016-7-19, Shenzhen
来源:https://www.cnblogs.com/helloworldtoyou/p/5686693.html