java - 如何通过 JNI 将 C 字符串表情符号传递给 Java
问题描述
我正在尝试通过 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?
谢谢大家。
解决方案
从我的回答中抄袭,您可以使用 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);
推荐阅读
- c - 为什么当我对 char** 执行 clasic parcel 时长字符串会使程序崩溃
- data-structures - 更新深层数据结构(Common Lisp)
- directx - 如何在 Direct2d 中从另一个 PathGeometry 中排除一个 PathGeometry?CombineWithGeometry 排除模式在组合 PathGeometry 时无法正常工作
- angular - 垫板上的动态类以角度打开
- python - 由于重力将他推入地面,玩家将无法正确移动
- python - 密码生成器如何包含字符串的每个部分
- android - 如何使用自定义对话框而不是编辑文本首选项中的原始对话框
- python - 如何让硒控制我(用户)?
- python - 将两个 csv 文件与一个共同元素组合并在没有熊猫的情况下进行排序
- sql-server - 没有提供 mssql-server-is 所需的 python