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



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

试图使用AAssetManager加载"strings.xml"文件,没有效果。返回相同的错误

我试着寻找各种其他实现,但没有一个工作

Android API level (Project): 25

Android API level (Device): 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 ()from libc。so,以及"序列包含多个元素">

你找错地方了。R.string的值。Some_string不是字符串本身——它是一个引用字符串的整数。要获得实际的字符串,您需要调用Context.getResources().getString(),并将您想要的id传递给getString。

这样设置是为了资源本地化。R类保存用于引用字符串的id,并且可以在任何时候使用。Resources类保存了这些id到实际字符串的映射,并且将为不同的地区、屏幕大小、方向等创建不同的Resources实例。

最新更新