NDK开发:使用ndk-build构建native代码

使用CMake构建native代码这一篇NDK开发:使用CMake构建native代码

第一步:

定义java 本地接口文件JNIUtils

public class JNIUtils {
    //静态代码块加载动态库(moduleName)
    static {
        //字符串内名字需要跟下文中Android.mk文件LOCAL_MODULE := my_jni,的my_jni一致.
        System.loadLibrary("my_jni");
    }
    //native定义jni在方法
    //这里简单从native代码中获取字符串
    public native String getStringFromJni();
}
}

第二步:(可选)

在app build.gradle defaultConfig中添加自己想支持的构架

 ndk{
            // 设置支持的 SO 库构架
            abiFilters "armeabi-v7a", "arm64-v8a"
        }

第三步:

main目录下创建jni目录
NDK开发:使用ndk-build构建native代码_第1张图片
image.png
在jni目录下创建jni原文件jnitest.c
#include 
JNIEXPORT jstring JNICALL Java_com_leory_ndkdemo_JNIUtils_getStringFromJni
        (JNIEnv *env, jobject obj){
    return (*env)->NewStringUTF(env,"This is Jni test!");
}

Java_com_leory_ndkdemo_JNIUtils是上面JNIUtils路径,getStringFromJni对应的是方法名
这里简单的返回一个字符串

在jni目录下创建Android.mk文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := my_jni
LOCAL_SRC_FILES := jnitest.c
include $(BUILD_SHARED_LIBRARY)

LOCAL_MODULE是动态库的名字
LOCAL_SRC_FILES是源文件名字

关联gradle和ndk-build:app module下右键选择
NDK开发:使用ndk-build构建native代码_第2张图片
image.png

选择ndk-build构建,然后选择刚刚创建的Android.mk文件路径


NDK开发:使用ndk-build构建native代码_第3张图片
image.png

按ok确定后会自动在app build.grade 的android中生成下面代码(当然也可以手动添加),并编译

externalNativeBuild {
        ndkBuild {
            path file('src/main/jni/Android.mk')
        }
    }

生成的对就应的so文件在build->intermediates->ndkBuild下


NDK开发:使用ndk-build构建native代码_第4张图片
image.png

第四步:

在代码中调用


NDK开发:使用ndk-build构建native代码_第5张图片
image.png

页面显示成功


NDK开发:使用ndk-build构建native代码_第6张图片
image.png

第五步:(可选)

完成上面一上就已经成功了,不过每次都会调用了ndkBuild生成so文件,所以如果我们不经常改jni源代码,我们可以直接使用生成的so文件。

我们把生成的so文件复制到libs目录下(没有libs目录就新建一个)


NDK开发:使用ndk-build构建native代码_第7张图片
image.png

然后在build.gradle android 中指定jniLibs的目录

  sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }

接着把上面ndk-build构建的代码注释掉(需要重新编译的时候再打开),不然又会生成so文件与libs目录so文件冲突

//    externalNativeBuild {
//        ndkBuild {
//            path file('src/main/jni/Android.mk')
//        }
//    }

你可能感兴趣的:(NDK开发:使用ndk-build构建native代码)