jni with gradle

相关学习资料

Contents

https://www.baeldung.com/jni

https://www.protechtraining.com/bookshelf/java_fundamentals_tutorial/_java_native_interface_jni

https://wwmmyy.github.io/2017/09/21/Android%E6%BA%90%E7%A0%81%E4%B8%ADJNI%E7%94%A8%E6%B3%95%E6%80%BB%E7%BB%93/
Android源码中JNI用法总结

Android jni/ndk编程三:native访问java - chenxibobo - 博客园

相关代码

https://github.com/android/ndk-samples

其中https://github.com/android/ndk-samples/tree/main/hello-jniCallback

https://github.com/android/ndk-samples/tree/main/hello-jni java 代码用的是kotlin, 早期代码是java实现的

JNI基本原理

一句话解释语言和native语音通信的桥梁。

JNI基本原理上面的几个链接讲的比较清楚,关于怎样注册JNI或者说JNI的使用方法看:Android源码中JNI用法总结 JNI两种注册过程

注册native method的方式

怎样在gradle环境生成jni动态库

参考https://github.com/android/ndk-samples/tree/main/hello-jniCallback

网上的文档很多都是之前的步骤,查看代码实际运行才是有效的方法。

其实只需要添加:

1. ndkVersion // 这项也不是必须的

2. externalNativeBuild

    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
        }
    }

CMakeLists.txt就是个普通的 cmake file 文件

看上面的NDK(Side by side), 到路径Android SDK Location: /home/ws/Android/Sdk下:/home/ws/Android/Sdk/ndk/21.2.6472646, 也会自动下载

遇到的gradle相关的问题

1. 添加google()后报错

 buildscript {
     repositories {
+        google()
         jcenter()
     }


看File -> Project Structure 的配置

gradle文件里classpath 4.0.0对应上图的Android Gradle Plugin Version

这里的Gradle Version需要设置正确,否则更改gradle文件就莫名奇妙的错误

2. 使能 androidX

Android中使用AndroidX出现 but the ‘android.useAndroidX‘ property is not enabled的问题解决办法_码龙-的博客-CSDN博客_android.useandroidx

diff --git a/hello-jni/gradle.properties b/hello-jni/gradle.properties
index aac7c9b..6d8cf36 100644
--- a/hello-jni/gradle.properties
+++ b/hello-jni/gradle.properties
@@ -15,3 +15,6 @@ org.gradle.jvmargs=-Xmx1536m
 # This option should only be used with decoupled projects. More details, visit
 # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
 # org.gradle.parallel=true
+android.useAndroidX=true
+android.enableJetifier=true

JNI helper的作用

Array有关资源的释放

JNI对数组赋值排序,创建数组并返回给Java_forward-CSDN博客

JNI对数组赋值排序,创建数组并返回给Java

int com(const void *a, const void *b){
    return *(int *)a - *(int *)b;//升序
}
JNIEXPORT void JNICALL Java_com_test_git_jnidemo_JniUtil_JniDemo_passArrayMethod
        (JNIEnv *env, jobject jobj, jintArray jarr){
    //1.获取数组指针
    jint *arr = env->GetIntArrayElements(jarr, NULL);
    *arr = 100;
    //2.获取数组长度
    int len = env->GetArrayLength(jarr);
    //3.排序: 对输入数据进行直接操作
    qsort(arr, len, sizeof(jint), com);

    //4.释放资源:并没有分配memory释放什么资源?具体看下代码的实现/umi-r/art/runtime/jni/jni_internal.cc 如果要搞清楚jni代码还是要看的
    env->ReleaseIntArrayElements(jarr, arr, JNI_COMMIT);
    //  对于最后一个参数(如果指针指向的数组为副本时,否则该参数不起作用)
    //      0       copy back the content and free the elems buffer
    //      JNI_COMMIT      copy back the content but do not free the elems buffer
    //      JNI_ABORT       free the buffer without copying back the possible changes
};

JNI生成数组,并返回

JNIEXPORT jintArray JNICALL Java_com_test_git_jnidemo_JniUtil_JniDemo_createArrayMethod
        (JNIEnv *env, jobject jobj, jint len){
    //1.新建长度len数组
    jintArray jarr = env->NewIntArray(len);
    //2.获取数组指针
    jint *arr = env->GetIntArrayElements(jarr, NULL);
    //3.赋值
    int i = 0;
    for(; i < len; i++){
        arr[i] = i;
    }
    //4.释放资源
    env->ReleaseIntArrayElements(jarr, arr, 0);
    //5.返回数组
    return jarr;
};

MainActivity中调用

        int[] arr = {1, 3, 2, 6, 8, 0};
        Log.i(TAG, "arr修改前: " + getArrayString(arr));
        jd.passArrayMethod(arr);
        Log.i(TAG, "arr修改后: " + getArrayString(arr));

        Log.i(TAG, "------------------------------------------");

        int[] arr_new = jd.createArrayMethod(10);
        Log.i(TAG, "arr_new: "+ getArrayString(arr_new) );

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值