JNI内通过参数形式从C/C++中传递string类型数据至Java层
创始人
2024-05-30 04:17:15
0

目录

0  前言

1 string类型参数形式传值

2 测试和结果


0  前言

        类似之前我写过的两篇文章:一篇介绍了在JNI中基础类型int的传值方式;一篇详细梳理了在JNI层中多维数组的多种传值方式。

JNI内两种方式从C/C++中传递一维、二维、三维数组数据至Java层详细梳理_nanke_yh的博客-CSDN博客

JNI内形参从C代码中获取返回值并返回到Java层使用-CSDN博客

        这篇则主要是讲JNI中String类型的数据如何通过参数的形式传递数据值。

1 string类型参数形式传值

        对于JNI层传递string类型数据的网络检索,出现的并不多。大多都是讲通过return方式进行内容传递的,大家大可参考:JNI String类型 - 知乎 (zhihu.com),内部有相关理论介绍可以了解。

        通过参数形式传递string类型数据具体借鉴了下文:JNI 通过形参String返回数据的方法_jni string 参数返回_Cosmo_Wang1989的博客-CSDN博客

本文具体的其实也是将string传递成StringBuffer类型,即以StringBuffer作为参数传入获取内部string数据。如此在c/c++中就有了以下的实现代码:(具体的分析解释看代码中的注释)

//最终实际传出的数据类型为StringBuffer
JNIEXPORT jint Java_com_test_java_JNItest_testString(JNIEnv *env, jobject, jobject result)
{string  sstr = "Hello world!"; //str.c_str()转成const char*const char* str = sstr.c_str();//jstring的类型jclass strClass = (env)->FindClass("Ljava/lang/String;");//methodIDjmethodID ctorID = (env)->GetMethodID(strClass, "", "([BLjava/lang/String;)V");//通过字符数组存储字符串 jbyteArray bytes = (env)->NewByteArray(strlen(str));(env)->SetByteArrayRegion(bytes, 0, strlen(str), (jbyte*)str);//规定字符为UTF-8jstring encoding = (env)->NewStringUTF("UTF-8"); //得到jstring类型的数据   //若采用return方式传出的话,则可以直接返回temp。jstring temp=(jstring)(env)->NewObject(strClass, ctorID, bytes, encoding);//获取需要传出去result参数类型jclass outputJcls = env->GetObjectClass(result);//根据result数据类型获取append操作的methodIDjmethodID appendJmId = env->GetMethodID(outputJcls, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;");//再根据methodID将jstring传到参数result上env->CallObjectMethod(result, appendJmId, temp);return 0;
}

2 测试和结果

        针对上述的代码实现,在java层调用native并测试:

public native int testString(StringBuffer result);

        main函数内测试代码:

        JNItest JNI = new JNItest();StringBuffer output = new StringBuffer();int rnt = JNI.testString(output);//StringBuffer通过toString即可转为StringSystem.out.println(output.toString());

        其中StringBuffer通过toString即可转为String,关于Java中这些字符串类型之间关系可参考:Java中字符数组、String类、StringBuffer三者的相互转换 - 功夫 熊猫 - 博客园 (cnblogs.com)

        最后运行结果如下:

         根据结果可以发现,output获取了c/c++层内部sstr的数据内容了。

相关内容

热门资讯

关于让高考成绩再提高的方法(... 关于让高考成绩再提高的方法 篇一如何提高高考成绩?这是每位学生都关心的问题。高考成绩对于学生的未来发...
议论文人物故事写作素材15例... 议论文人物故事写作素材15例 篇一1. 父母的无私奉献 故事背景:主人公的父母为了供他上大学,...
教育部考试中心称不会取消全国... 教育部考试中心称不会取消全国统一高考 篇一近日,教育部考试中心发表声明称,不会取消全国统一高考。这一...
高考报考志愿个人陈述范文【最... 高考报考志愿个人陈述范文 篇一我的高中三年时光即将结束,我心中充满了对未来的期待和憧憬。回顾过去的学...
手握一滴水高考满分作文【精简... 手握一滴水高考满分作文 篇一探寻水的力量水,是生命之源,也是大自然最神奇的力量之一。曾经,我手握着一...
语文高考全国一卷优秀作文【精... 语文高考全国一卷优秀作文 篇一题目:诗意的人生人生如诗,每个人都是一首独特的诗篇。我们的人生是由一段...
高考作文经典素材:正能量【实... 高考作文经典素材:正能量 篇一正能量:改变人生的力量正能量是指积极向上的思想、激励人心的言行,具有积...
庚子年高考作文范文【精简6篇... 庚子年高考作文范文 篇一我的成长历程人生就像一场马拉松,每个人都要经历各种各样的挑战与困难。而我,也...
高考作文语文范文欣赏(优选6... 高考作文语文范文欣赏 篇一《人生的价值》人生自古以来就是一个永恒的话题,而关于人生的探讨与思考也从未...
北京高考作文题目(优选5篇) 北京高考作文题目 篇一新时代下的北京高考近年来,随着社会的进步和发展,新时代给北京高考带来了新的挑战...
历年经典高考满分作文【实用6... 历年经典高考满分作文 篇一:成长的意义成长是每个人都要经历的过程,它伴随着我们从孩提时代向成年人迈进...
难忘的经历高考作文【精选6篇... 难忘的经历高考作文 篇一高考,是每个学生的一场关键考试,也是一段难以忘怀的经历。回忆起那段时光,我至...
高考作文复习【优秀3篇】 高考作文复习 篇一高考作文是考生最重要的一项考试内容,也是考察学生综合能力的重要指标。为了顺利应对高...
四川高考作文【精选5篇】 四川高考作文 篇一:探索自我,实现梦想高考作文题目:探索自我,实现梦想作文要求:请以“探索自我,实现...
高考复读学校招生模板范文(优... 高考复读学校招生模板范文 篇一:提升学业水平,实现梦想的机会尊敬的家长和考生:您好!感谢您对我们学校...
高考语文万能作文素材(优质6... 高考语文万能作文素材 篇一第一篇内容:文学与人生文学是人类的精神财富,是人类智慧的结晶。它以文字为媒...
高考作文预测与:兑现承诺(通... 高考作文预测与:兑现承诺 篇一在高考备考期间,很多学生会参加各种辅导班和模拟考试,以提高自己的成绩。...
高考满分作文(实用6篇) 高考满分作文篇一:重拾初心,追寻梦想高考,是每个学生人生中的一次大考,也是人生道路上的一个重要转折点...
高考满分作文勇气范文【推荐6... 高考满分作文勇气范文 篇一标题:勇往直前,迎接挑战勇气是一种伟大的品质,它可以使我们面对困难和挑战时...
全国一卷高考优秀作文【优秀6... 全国一卷高考优秀作文 篇一:领导力的重要性在现代社会中,领导力被广泛认为是一种重要的能力。无论是在学...