我正在尝试通过JNI将数据库值传递给Java:
__ android_log_print(ANDROID_LOG_ERROR,“ MyApp”,“ c_string >>>%s”,cStringValue);
prints: c_string >>>👑👟👓
env->SetObjectField(jPosRec, myJniPosRec->_myJavaStringValue, env->NewStringUTF(strdup(cStringValue)));
但是,此操作将失败且没有错误。
您如何将特殊字符(例如表情符号)传递给JNI中的Java?
谢谢大家。
首先,您正在泄漏strdup()
分配的内存。使用完后,需要将char*
指针从strdup()
传递到free()
。完全不需要调用strdup()
,您可以将cStringValue
直接传递给NewStringUTF()
。
就是说,JNI的NewStringUTF()
函数要求输入的C字符串为modified UTF-8格式,而标准C ++对此一无所知。尽管可以用这种格式创建char*
字符串,但是您将必须手动创建。由于Java字符串使用UTF-16接口,并且标准C ++具有使用UTF-16字符串的功能,因此我强烈建议您改用JNI的NewString()
函数。
如果数据库代码允许您检索UTF-16格式的字符串,那么您已经准备就绪。如果不是,则必须在将字符串传递给JNI之前将其转换为UTF-16(就像将它们转换为modified UTF-8)一样。