gpt4 book ai didi

android - 使用 JNI 将 4 字节 wchar_t 转换为字符串

转载 作者:行者123 更新时间:2023-12-02 10:21:38 27 4
gpt4 key购买 nike

所以我有这个 CanvasView 显示我的应用程序的调试信息。它基本上是具有透明背景的叠加 View ,因此 Canvas 中绘制的所有内容都漂浮在屏幕中。由于我需要返回 wchar_t* 的 native c++ 中的一些信息,我该如何使用 env->NewString因为android现在让wchar_t是4个字节,而jchar是2个字节?

在我的库中调用 native c++ 函数的 java 代码:

private static String get_Name();
private class CanvasView extends View{
public CanvasView(Context context){
super(context);
}

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);

Paint paintText = new Paint();
paintText.setStyle(Paint.Style.FILL);
paintText.setColor(Color.WHITE);
paintText.setShadowLayer(5.5f, 0, 0, Color.BLACK);
paintText.setTextSize(convertSizeToDp(7.5f));
paintText.setTextAlign(Paint.Align.LEFT);

paintText.drawText(get_Name(), x, y, paintText);


// the rest of the code
// ...
}
}
get_Name基本上返回一个来自 NewString((const jchar* )myWchar, myLen) 的 jstring

返回结果有时是非 unicode 字符串,甚至我的应用程序在 NewString 时崩溃叫做。

最佳答案

首先,分配一个ByteBuffer使用 JNI:

wchar_t *input = ...;
jobject bb = env->NewDirectByteBuffer((void *) input, wcslen(input) * sizeof(wchar_t));

接下来,调用 Charset.forName("UTF-32LE").decode(bb).toString() :(每段都是一步)
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-32LE"));

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 ret = env->CallObjectMethod(cb, mid_CharBuffer_toString);

return ret;

注意:这取决于您所在平台的字节序。来自 this answer似乎所有的 Android 平台都是小端的。您可能需要使用 UTF-32BE相反,如果您在大端平台上。

关于android - 使用 JNI 将 4 字节 wchar_t 转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59893758/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com