Android Java代码与JNI交互字符串转换(四)

这篇具有很好参考价值的文章主要介绍了Android Java代码与JNI交互字符串转换(四)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🔥 Android Studio 版本 🔥 

Android Java代码与JNI交互字符串转换(四),AndroidNDK,jni,ndk,Java,C++

🔥 创建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()

 jsize GetStringLength(jstring string)
    { return functions->GetStringLength(this, string); }

案例下载文章来源地址https://www.toymoban.com/news/detail-548204.html

到了这里,关于Android Java代码与JNI交互字符串转换(四)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android Java代码与JNI交互 JNI访问Java构造方法(九)

    🔥 Android Studio 版本 🔥    🔥 创建包含JNI相关函数类 JNIConstructorClass.java 🔥  🔥 配置动态库名称 🔥   🔥 生成可关联的库链接 🔥  为了让Java能够调用 constructor-class-lib 库中的函数,您需要使用 CMake 构建脚本中的 target_link_libraries() 命令来关联constructor-class-lib 库  🔥

    2024年02月15日
    浏览(40)
  • Android Java代码与JNI交互 JNI子线程访问Java方法 (八)

    🔥 Android Studio 版本 🔥   🔥 创建包含JNI相关函数类 JNIInvokeMethod.java 🔥  🔥 配置动态库名称 🔥  🔥 生成可关联的库链接 🔥  为了让Java能够调用 invoke-method-lib 库中的函数,您需要使用 CMake 构建脚本中的 target_link_libraries() 命令来关联 invoke-method-lib 库  🔥 提供给N

    2024年02月16日
    浏览(48)
  • java将list转为逗号隔开字符串,将逗号连接的字符串转成字符数组,​将逗号分隔的字符串转换为List​(Java逗号分隔-字符串与数组相互转换)

       参考:java将list转为逗号隔开字符串_51CTO博客_list转字符串逗号隔开 Java将字符串转化为数组_java 字符串转数组-CSDN博客  Java逗号分隔-字符串与数组相互转换-CSDN博客  

    2024年02月08日
    浏览(69)
  • Java中如何将字符串转换为JSON格式字符串

    Java中如何将字符串转换为JSON格式字符串 在Java编程中,我们经常需要处理JSON数据格式。有时候,我们需要将一个普通的字符串转换为JSON格式的字符串。幸运的是,Java提供了多种方法来实现这个目标。在本文中,我将介绍两种常见的方法来将字符串转换为JSON格式字符串。 方

    2024年02月06日
    浏览(58)
  • Java字符串与字符型数组的转换

    通过本章可以了解到字符串与字符型数组之间相互转换的几种方法。 文章目录 一、字符串 —— 字符型数组  .toCharArray方法 .getChar方法 二、字符型数组 —— 字符串 .String方法 .copyValueOf方法         toCHarArray是将字符串中的一切字符均转换为字符数组。         用法为:字

    2024年02月15日
    浏览(46)
  • Java中字符串与日期转换

    DateTime使用依赖 方法1: 方法2:

    2024年02月08日
    浏览(104)
  • java中将数组转换成字符串

    方法1:使用StringBuilder拼接 基本类型和引用类型兼容  输出结果: 方法2:Arrays.toString(); 基本类型和引用类型兼容,返回值为String 输出结果: toString()底层代码实现,可见是用StringBuilder进行拼接的,底层源代码: 方法三:使用 Arrays.stream()流 当 数组类型是基本类型 时需要

    2024年02月07日
    浏览(61)
  • Java字符串和数字类型的转换

    在Java中,数字和字符之间的转换可以通过类型转换或字符串转换实现。 一、类型转换 在Java中,数字类型可以转换为字符类型,也可以将字符类型转换为数字类型。数字类型可以使用强制类型转换将其转换为字符类型,例如: 1.数字转字符 上面的代码中,我们将数字65强制转

    2024年02月16日
    浏览(56)
  • java怎么把字符串转换成日期类型

    1、java怎么把字符串转换成日期类型 2、Java如何将指定字符串转化为指定日期格式 3、求JAVA高手解答!有关于字符串类型转换成日期型! 4、Java中怎么把字符串转换成日期格式啊 5、java中怎样将字符串转换成日期形式存入数据库 定义一个字符串类型的时间 java字符串转日期 ;创

    2024年02月06日
    浏览(52)
  • Java中字符串和日期类型的相互转换

    当在Java中进行字符串和日期类型之间的相互转换时,可以使用 SimpleDateFormat 类来实现。下面是一个详细的代码示例,展示了如何将字符串转换为日期类型,以及如何将日期类型转换为字符串。 首先,我们来看字符串转换为日期类型的示例代码: 在上述代码中,我们首先定义

    2024年02月14日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包