温馨提示:本文翻译自stackoverflow.com,查看原文请点击:android - How to pass a C String Emoji to Java via JNI
android c++ java java-native-interface emoji

android - 如何通过JNI将C字符串表情符号传递给Java

发布于 2020-03-29 21:39:44

我想通过JNI将数据库值传递给Java:

__android_log_print(ANDROID_LOG_ERROR,“ MyApp”,“ c_string >>>%s”,cStringValue);

打印: c_string >>> ????????????

env->SetObjectField(jPosRec, myJniPosRec->_myJavaStringValue, env->NewStringUTF(strdup(cStringValue)));  

但是,这将失败且没有错误。

如何在JNI 中将特殊字符(如表情符号)传递给Java?

谢谢大家。

查看更多

提问者
Program-Me-Rev
被浏览
18
Botje 2020-01-31 18:24

这里的答案开始,您可以使用等效于JNI的

Charset.forName("UTF-8").decode(bb).toString()

如下所示,其中每个段落大致实现一个步骤,最后一个将您的对象字段设置为结果:

jobject bb = env->NewDirectByteBuffer((void *) cStringValue, strlen(cStringValue));

jclass cls_Charset = env->FindClass("java/nio/charset/Charset");
jmethodID mid_Charset_forName = env->GetStaticMethodID(cls_Charset, "forName", "(Ljava/lang/String;)Ljava/nio/charset/Charset;");
jobject charset = env->CallStaticObjectMethod(cls_Charset, mid_Charset_forName, env->NewStringUTF("UTF-8"));

jmethodID mid_Charset_decode = env->GetMethodID(cls_Charset, "decode", "(Ljava/nio/ByteBuffer;)Ljava/nio/CharBuffer;");
jobject cb = env->CallObjectMethod(charset, mid_Charset_decode, bb);

jclass cls_CharBuffer = env->FindClass("java/nio/CharBuffer");
jmethodID mid_CharBuffer_toString = env->GetMethodID(cls_CharBuffer, "toString", "()Ljava/lang/String;");
jstring str = env->CallObjectMethod(cb, mid_CharBuffer_toString);

env->SetObjectField(jPosRec, myJniPosRec->_myJavaStringValue, str);