JNI笔记-字符串拼接

大憨熊 提交于 2019-12-13 09:31:18

参考博客: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。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!