🔥 Android Studio 版本 🔥
🔥 创建JNIString.java 🔥
package com.cmake.ndk1.jni; public class JNIString { static{ System.loadLibrary("string-lib"); } public native String callNativeString(String str); public native void stringMethod(String str); }
🔥 Native层实现 JNI的callNativeString函数 🔥
#include <base.h> #include <string> extern "C" JNIEXPORT jstring JNICALL Java_com_cmake_ndk1_jni_JNIString_callNativeString(JNIEnv *env, jobject thiz, jstring str_) { //java风格的字符串转化成C语音风格的字符串(Java传递过来的字符串是UTF-8编码的) const char * str=env-> GetStringUTFChars(str_,0); LOGD("java string is %s",str); //GetStringUTFChars是为 str 开辟了内存空间,所以使用完成后要删除内存空间 //TODO Get开头的函数和Release开头的函数是配套使用的 env->ReleaseStringUTFChars(str_,str); //返回字符串给应用上层 return env->NewStringUTF("this is C style string"); }
🔥 配置动态库名称 🔥
编辑CMakeLists.txt 根据j ni/jni_string.cpp 配置动态库名称
add_library( #动态库名称 string-lib string-lib SHARED jni/jni_string.cpp )
🔥 生成可关联的库链接 🔥
为了让Java能够调用 string-lib库中的函数,您需要使用 CMake 构建脚本中的 target_link_libraries() 命令来关联string-lib 库
target_link_libraries( # Specifies the target library. ndk1 person-lib dynamic-lib basic-type-lib string-lib # Links the target library to the log library # included in the NDK. ) )
🔥 提供给jni调用的日志库链接 🔥
target_link_libraries( # Specifies the target library. string-lib # Links the target library to the log library # included in the NDK. ${log-lib})
运行结果
D/LOG_JNI: java string is 传递给 callNativeString 函数的字符串 D/MainActivity4: this is C style string
🔥 Native层实现stringMethod函数 🔥
#include <base.h> #include <string> extern "C" JNIEXPORT jstring JNICALL Java_com_cmake_ndk1_jni_JNIString_callNativeString(JNIEnv *env, jobject thiz, jstring str_) { //java风格的字符串转化成C语音风格的字符串(Java传递过来的字符串是UTF-8编码的) const char * str=env-> GetStringUTFChars(str_,0); LOGD("java string is %s",str); //GetStringUTFChars是为 str 开辟了内存空间,所以使用完成后要删除内存空间 //TODO Get开头的函数和Release开头的函数是配套使用的 env->ReleaseStringUTFChars(str_,str); //返回字符串给应用上层 return env->NewStringUTF("this is C style string"); } //将Java字符串的内容转换成C语言对应的字符串内容 extern "C" JNIEXPORT void JNICALL Java_com_cmake_ndk1_jni_JNIString_stringMethod(JNIEnv *env, jobject thiz, jstring jstr) { const char *str=env->GetStringUTFChars(jstr,0); char buf[128]; int len = env->GetStringLength(jstr); LOGD("java string length is %d",len); //获取字符串长度-1的内容,存储到buf中 env->GetStringUTFRegion(jstr,0,len-1,buf); LOGD("jstring is %s",buf); //释放内存空间,避免内存泄漏 env->ReleaseStringUTFChars(jstr,str); }
运行结果
D/LOG_JNI: java string is 传递给 callNativeString 函数的字符串 D/MainActivity4: this is C style string D/LOG_JNI: java string length is 23 D/LOG_JNI: jstring is 传递给 stringMethod 函数的字符 D/AwareBitmapCacher: handleInit switch not opened pid=15541
🔥 总结 🔥
jni字符串转换 GetStringUTFChars()
java风格的字符串转化成C语音风格的字符串(Java传递过来的字符串是UTF-8编码的)
const char* GetStringUTFChars(jstring string, jboolean* isCopy) { return functions->GetStringUTFChars(this, string, isCopy); }
jni释放内存空间 ReleaseStringUTFChars()
void ReleaseStringUTFChars(jstring string, const char* utf) { functions->ReleaseStringUTFChars(this, string, utf); }
jni 获取字符串长度 GetStringLength()文章来源:https://www.toymoban.com/news/detail-548204.html
jsize GetStringLength(jstring string) { return functions->GetStringLength(this, string); }
案例下载文章来源地址https://www.toymoban.com/news/detail-548204.html
到了这里,关于Android Java代码与JNI交互字符串转换(四)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!