无法通过本机 C 应用程序中的 JNI 从 R.string.* 获取 jstring

Unable to get a jstring from R.string.* via JNI in a native C application

我正在开发原生 c/c++ 应用程序,它通过 strings.xml 文件使用字符串资源。

尝试使用 AAssetManager 加载“strings.xml”文件,没有任何效果。 Returns同样的错误

我尝试寻找各种其他实现,但 none 有效

Android API 级别(项目): 25

Android API 级别(设备): 30

到目前为止我尝试使用的代码如下:

JNIEnv* jni;
g_App->activity->vm->AttachCurrentThread(&jni, NULL);
jclass rcl = jni->FindClass("com.avetharun.rosemary.R$string");
// attempted the above as well as "... R.string" instead of "... R$string"
jfieldID fid = jni->GetStaticFieldID(rcl, "app_name", "s");
// attempted the above as well as "Ljava/lang/String;" instead of "s"
jstring jstr = (jstring)jni->GetObjectField(rcl, fid);
const char* str = jni->GetStringUTFChars(jstr, 0);

目录树:

assets
- test.txt
res
- values
- - strings.xml

strings.xml :

<string name="app_name">Rosemary Project</string>

运行 这会导致错误:0x0000007f1881daac in __rt_sigtimedwait () 来自 libc.so,以及“序列包含多个元素”

你找错了。 R.string.some_string 处的值不是字符串本身——它是一个引用字符串的整数。要获取实际的字符串,需要调用Context.getResources().getString(),传入要getString的id。

这样设置是为了资源本地化。 R class 保存用于引用字符串的 id,可以随时使用。 Resources class 包含这些 id 到实际字符串的映射,并且将为不同的区域设置、屏幕尺寸、方向等创建不同的 Resources 实例。