1.创建一个类Utils(如果为了到时打包jar包,先创建个包名)
2.在gradle.properties文件中加入
android.useDeprecatedNdk=true
3.在Utils中写如native方法,然后在android studio的菜单build—>make project
public class Utils { //java调C中的方法都需要用native声明且方法名必须和c的方法名一样 public native String getString(); }4.切换出android studio的命令行terminal
默认是在当前的项目根路径,在根路径输入cd app\src\main\java
5.输入javah -d ../jni -encoding UTF-8 com.nodepp.jni.Utils()(../jni 代表生成的jni目录在app\src\main ),之后在app\src\main出现jni目录 ,并且产生一个.h文件com_nodepp_jni_Utils.h(包名_类名.h)。
注意,第3,4步生成也可以采用以下方法
然后在命令行中先进入到工程的main目录下
输入命令:javah -d jni -classpath 自己编译后的class文件的绝对路径
例如:javah -d jni -classpath
javah -d jni -classpath D:\yuyue\testJNI\app\build\intermediates\classes\debug com.nodepp.jni.Utils
(注意的debug之后又空格)
这种方法会产生和上面3,4步一样的结果
6.在jni下面创建一个.c文件(名字任意),在c文件里面要导入刚才生成的.h头文件
#include "com_nodepp_jni_Utils.h" JNIEXPORT jstring JNICALL Java_com_nodepp_jni_Utils_getString (JNIEnv *env, jobject obj){ return (*env)->NewStringUTF(env, "这是我测试的jni"); }//方法名称要跟生成的.h里面的名称一模一样Java_包名_类名_方法名
7.最后在构建文件中的默认配置中加上:ndk配置
android { compileSdkVersion 24 buildToolsVersion "24.0.1" defaultConfig { applicationId "com.test.nodepp.testjni" minSdkVersion 15 targetSdkVersion 24 versionCode 1 versionName "1.0" //ndk编译生成.so文件 ndk { moduleName "goo" //生成的so名字 abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种abi体系结构下的so库。 } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } }
8. 在android studio的菜单build—>make project,然后会在app/build/ndk 看到生成的so文件
9.在Utils类文件中加入
public class Utils { static { System.loadLibrary("goo");//加载的库名称要和刚才ndk配置里的一样 } //java调C中的方法都需要用native声明且方法名必须和c的方法名一样 public native String getString(); }10.直接像调用java的类方法一样直接调用getString()方法