🔥 Android Studio 版本 🔥
🔥 Java中基础数据类型对应Native的数据类型 🔥
* Java中基础数据类型对应Native中的数据类型 * |Java |Native | * |boolean |jboolean | * |byte |jbyte | * |short |jshort | * |int |jint | * |long |jlong | * |float |jfloat | * |double |jdouble |
🔥 Java中引用数据类型 对应Native中的数据类型 🔥
* Java中引用数据类型 对应Native中的数据类型 * |Java Reference |Native |Java Reference |Native | * |All objects |jobject |char[] |jcharArray | * |java.lang.Class |jclass |short[] |jshortArray | * |java.lang.String |jstring |int[] |jintArray | * |Object[] |jobjectArray |long[] |jlongArray | * |boolean[] |jbooleanArray |float[] |jfloatArray | * |byte[] |jbyteArray |double[] |doubleArray | * |java.lang.Throwable |jthrowable
🔥 创建 JNIReferenceType 🔥
package com.cmake.ndk1.jni; public class JNIReferenceType { static { System.loadLibrary("reference-type-lib"); } public native String callNativeStringArray(String[] strArray); }
🔥 生成可关联的库链接 🔥
为了让Java能够调用reference-type-lib库中的函数,您需要使用 CMake 构建脚本中的 target_link_libraries() 命令来关联reference-type-lib 库
target_link_libraries( # Specifies the target library. ndk1 person-lib dynamic-lib basic-type-lib string-lib reference-type-lib # Links the target library to the log library # included in the NDK. ) )
🔥 提供给 Natvie层 调用的日志库链接 🔥
target_link_libraries( # Specifies the target library. reference-type-lib # Links the target library to the log library # included in the NDK. ${log-lib})
🔥 Native层 实现 callNativeStringArray 函数 🔥
#include <base.h> #include <string> #include <jvm.h> /** * Java中基础数据类型对应Native中的数据类型 * |Java |Native | * |boolean |jboolean | * |byte |jbyte | * |short |jshort | * |int |jint | * |long |jlong | * |float |jfloat | * |double |jdouble | */ /** * Java中引用数据类型 对应Native中的数据类型 * |Java Reference |Native |Java Reference |Native | * |All objects |jobject |char[] |jcharArray | * |java.lang.Class |jclass |short[] |jshortArray | * |java.lang.String |jstring |int[] |jintArray | * |Object[] |jobjectArray |long[] |jlongArray | * |boolean[] |jbooleanArray |float[] |jfloatArray | * |byte[] |jbyteArray |double[] |doubleArray | * |java.lang.Throwable |jthrowable */ extern "C" JNIEXPORT jstring JNICALL Java_com_cmake_ndk1_jni_JNIReferenceType_callNativeStringArray(JNIEnv *env, jobject thiz, jobjectArray str_array) { //获取数组长度 int len = env->GetArrayLength(str_array); //打印长度 LOGD("len is %d", len); //获取对象数组的某一个元素(首元素) //获取其他数组类型的某一个元素可以使用类似的方式 jstring jStringValue = static_cast<jstring>(env->GetObjectArrayElement(str_array, 0)); // 打印jStringValue需要通过 GetStringUTFChars 转换,再打印 const char *str = env->GetStringUTFChars(jStringValue, 0); LOGD("string value is %s", str); //释放掉jStringValue的内存空间 env->ReleaseStringUTFChars(jStringValue,str); //将str返回给应用层 return env->NewStringUTF(str); }
🔥 调用Native层相关函数 🔥
package com.cmake.ndk1; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.TextView; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import com.cmake.ndk1.jni.JNIReferenceType; import com.cmake.ndk1.jni.JNIString; public class MainActivity5 extends AppCompatActivity { private String[] stringArrays={"字符串1","字符串2","字符串3"}; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); JNIReferenceType referenceType=new JNIReferenceType(); final TextView textView=findViewById(R.id.sample_text); textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String str=referenceType.callNativeStringArray(stringArrays); Log.d("MainActivity5",String.valueOf(str)); } }); } }
运行结果 : 文章来源:https://www.toymoban.com/news/detail-549731.html
D/LOG_JNI: len is 3 D/LOG_JNI: string value is 字符串1 D/MainActivity5: 字符串1
下载案例文章来源地址https://www.toymoban.com/news/detail-549731.html
到了这里,关于Android Java代码与JNI交互 引用类型转换(五)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!