JNI笔记-字符串拼接

参考博客:https://blog.csdn.net/cloverjf/article/details/78851988

记录一下在JNI中,由java传递到JNI,然后拼接返回新字符串的实现方式:

1、简单粗暴型

extern "C"
JNIEXPORT jstring JNICALL
Java_com_wyl_ndkdemo_JniTest_contactString2(JNIEnv *env, jobject thiz, jstring str1, jstring str2) {
    //1、直接使用GetStringUTFChars方法将传递过来的jstring转为char*
    char *c1 = (char *) (env->GetStringUTFChars(str1, JNI_FALSE));
    char *c2 = (char *) (env->GetStringUTFChars(str2, JNI_FALSE));
    //2、再使用本地函数strcat 拼接两个char*对象,然后NewStringUTF转为jstring返回去
    char *res = strcat(c1, c2);
    return env->NewStringUTF(res);
}

2、活学活用型
在学习JNI的过程中,慢慢的我们知道在JNI中,是可以访问使用java里面的方法的,在JNI中没有提供直接拼接字符串的方法,但是java中的这类方法可数不胜数的呢,所以:

extern "C"
JNIEXPORT jstring JNICALL
Java_com_wyl_ndkdemo_JniTest_concatString(JNIEnv *env, jobject thiz, jstring str1, jstring str2) {
    //找到String类
    jclass js = env->FindClass("java/lang/String");
    //再找到它里面的拼接函数的 jmethodID,注意在java中   String concat(String str)
    jmethodID mid = env->GetMethodID(js, "concat", "(Ljava/lang/String;)Ljava/lang/String;");
    //然后调用CallObjectMethod方法,相当于执行了java语句   str1.concat(str2);
    jstring res = (jstring) env->CallObjectMethod(str1, mid, str2);
    return res;
}

3、天马行空型
这种方法即使用了java方法,也用了JNI函数,混合使用=.=!

extern "C"
JNIEXPORT jstring JNICALL
Java_com_wyl_ndkdemo_JniTest_concatString3(JNIEnv *env, jobject thiz, jstring str1, jstring str2) {
    //调用自定义方法 将jstring 转为char*
    char *res1 = Jstring2char(env, str1);
    char *res2 = Jstring2char(env, str2);
    //再使用strcat拼接 
    char *result = strcat(res1, res2);
    return  env->NewStringUTF(result);

}
//注意该方法要先声明在调用者前面
char *Jstring2char(JNIEnv *env, jstring dst) {
    //1、利用java函数getBytes获取到jbyteArray对象  
    //注意了  getBytes重载方法有几个,需要根据参数列表来做相应变化
    jclass js = env->FindClass("java/lang/String");
    jmethodID mid = env->GetMethodID(js, "getBytes", "(Ljava/lang/String;)[B");//signture 
    jstring jcode = env->NewStringUTF("GB2312");
    jbyteArray jba = (jbyteArray) env->CallObjectMethod(dst, mid, jcode);//参数列表
    //2、利用JNI提供的函数来jbyteArray转为char*对象
    jsize size = env->GetArrayLength(jba);
    jbyte *jb = env->GetByteArrayElements(jba, JNI_FALSE);
    char *result = NULL;
    if (size > 0) {
        result = static_cast<char *>(malloc(size + 1));//创建对象
        memcpy(result, jb, size);//复制
        result[size] = 0;
    }
    env->ReleaseByteArrayElements(jba, jb, 0);//释放
    return result;
}

至于优劣性,等到后续更深入学习时在讨论。暂时觉得,前两种可能只适合纯粹的拼接场景,第三种的话,更适合需要对内容操作的情况,比如增删改某个char。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值