之前一直都不知怎么编写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目录
JNIDemoappuildintermediatesclassesdebug
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