现在网上有很多实用JNI的教程,本文主要用于记录自己实现的方法和遇到的坑。
第一步,下载NDK.
NDK可以去谷歌Android developer上下载。国内也有些中国版网站可以下载。
第二步,编写java类,这个类是java和c/c++交互的中介,定义一些native的方法,具体实现由c/c++完成。
packagecom.example.jni;/*** Created by alexjie on 2017/5/14.*/
public classJNIDemo {static{
System.loadLibrary("newclient");
}public static nativeString sayHello();
}
上部代码分两块,静态代码块用于加载我们后续要生成的c/c++实现的.so库,第二部分为定义的一个native的本地方法,此方法将由C++实现。
第三步,生成.h头文件
使用Android Studio的终端Terminal。
进入到main目录下 F:\Andriod\workspaceAS\Demo\newclient\src\main> ,使用命令生成.h头文件 javah -d jni -classpath ./java com.example.jni.JNIDemo
-d jni 头文件生成到jni文件夹(当前在\app\src\main目录下,所以.h所在的目录为\app\src\main\jni )
-classpath ./java 指定去当前路径下java下寻找包名指定的类
然后就会在main文件夹下生成jni文件夹和com_example_jni_JNIDemo.h
/*DO NOT EDIT THIS FILE - it is machine generated*/#include
/*Header for class com_example_jni_JNIDemo*/#ifndef _Included_com_example_jni_JNIDemo
#define _Included_com_example_jni_JNIDemo
#ifdef __cplusplus
extern"C"{
#endif/** Class: com_example_jni_JNIDemo
* Method: sayHello
* Signature: ()Ljava/lang/String;*/JNIEXPORT jstring JNICALL Java_com_example_jni_JNIDemo_sayHello
(JNIEnv*, jclass);
#ifdef __cplusplus
}
#endif
#endif
第四步,实现main.cpp
.h头文件生成了,现在要实现C++的具体实现,新建一个C++文件:
然后会生成一个main.cpp文件,将.h文件的内容拷入到main.cpp文件,并做具体实现:
//
//Created by alexjie on 2017/5/14.//
/*DO NOT EDIT THIS FILE - it is machine generated*/#include
/*Header for class com_example_jni_JNIDemo*/#ifndef _Included_com_example_jni_JNIDemo#define _Included_com_example_jni_JNIDemo#ifdef __cplusplusextern "C"{#endif
/** Class: com_example_jni_JNIDemo
* Method: sayHello
* Signature: ()V*/JNIEXPORT jstring JNICALL Java_com_example_jni_JNIDemo_sayHello(JNIEnv*env, jobject jobj){//返回一句话
return env->NewStringUTF((char *)"JNI hahahahahahahaha");
};
#ifdef __cplusplus
}#endif
#endif
第五步,配置NDK
打开Project的local.properties文件添加NDK路径
打开app Module的build.gradle文件,在defaultConfig节点里添加以下代码
注意这里的moduleName,是我们在之前自己编写的类里面加载的so库名
ndk {
moduleName"newclient"ldLibs"log", "z", "m"abiFilters"armeabi", "armeabi-v7a", "x86"}
在gradle.properties里面加上这么一句话:
android.useDeprecatedNdk=true
第六步,生成.so库
rebuilt项目,在如下目录会生成.so库:app\build\intermediates\ndk\debug\lib
在main文件夹下,新建一个jnilib文件夹,将.so库考到其中。
现在在程序中就可以调用JNIDemo.sayHello()方法了。
问题:
1.build apk时,报错:installation failed with message failed to establish session
解决:关闭MIUI开发者选项中的MIUI优化并重启!
原文:http://www.cnblogs.com/Alexwsj/p/6858175.html