参考博客: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。
来源:CSDN
作者:道阻且长丶
链接:https://blog.csdn.net/wyl_tyrael/article/details/103459890