一、JNI生成so及使用

JNI的使用

1   环境配置
1.1 NDK下载地址
https://developer.android.com/ndk/downloads/index.html
1.2 AS中打开Project Structure,SDK Location中配置NDK目录,打开项目的local.properties文件查看是否有ndk.dir=xxx,有表示成功
1.3 打开项目的gradle.properties文件,添加android.useDeprecatedNdk=true
2   生成so
2.1 创建一个jni工具类
public class NdkJniUtils {
    public native String getCLanguageString();
}
2.2 Ctl+F9 Make Project,在app\build\intermediates\classes\debug+包名的位置生成NdkJniUtils.class文件
2.3 点开AS的Terminal标签,
2.3.1   执行cd app\build\intermediates\classes\debug
2.3.2   假设包名为com.ywj.demojni
执行javah -jni com.ywj.demojni.NdkJniUtils
会在app\build\intermediates\classes\debug目录下生成
com_ywj_demojni_NdkJniUtils.h文件,在src/main目录下新建jni目录,将.h文件复制过去,
2.4 在src/main/jni目录下新建c文件jnitest.c(以.c结尾的c文件,名字随意),编辑
#include "com_ywj_demojni_NdkJniUtils.h"
/** c代码*/
JNIEXPORT jstring JNICALL Java_com_ywj_demojni_NdkJniUtils_getCLanguageString
  (JNIEnv *env, jobject obj){
     return (*env)->NewStringUTF(env,"This just a test for Android Studio NDK JNI developer!");
  }
2.5 修改NdkJniUtils
public class NdkJniUtils {
    static {
        System.loadLibrary("testJni");   //so名称,需要跟app gradle 中ndk配置生成的名称一致
    }
    public native String getCLanguageString();
}

2.6 在app gradle中的defaultConfig节点下添加
ndk{
            moduleName "testJni"         //生成的so名字
            abiFilters "armeabi", "armeabi-v7a", "x86"  //输出常用指定三种abi体系结构下的so库,默认会生成以下7种cpu架构so
            //arm64-v8a armeabi armeabi-v7a mips mips64 x86 x86_64
        }
2.7 在activity中使用
NdkJniUtils jni = new NdkJniUtils();
mTextView.setText(jni.getCLanguageString());
2.8 Shift+F10运行app或者Ctrl+F9构建项目,这时直接运行app在app\build\intermediates\ndk\debug\lib目录下就已经生成不同cpu类型的so包
3   使用so
3.1 在src/main目录下创建jniLibs文件夹,将不同cpu类型的so包复制过去

3.2 将src/main/jni 目录移除,
将gradle.properties文件中android.useDeprecatedNdk=true这一行移除(不移除也能正常运行)
将app gradle中的ndk配置也可以注释掉了(不注释也能正常运行)

猜你喜欢

转载自blog.csdn.net/u011106915/article/details/80266009