JNI中的资源Uri文件

3

你好,我正在尝试从可绘制资源的Uri中获取File对象。我使用以下代码:

jclass clazz;
jmethodID methodID;
jstring string1, string2, string3;
jobject object1, object2;

clazz = env->FindClass("android/net/Uri");
methodID = env->GetStaticMethodID(clazz, "parse", "(Ljava/lang/String;)Landroid/net/Uri;");
string1 = env->NewStringUTF("android.resource://com.appsite.android/drawable/grass");
object1 = env->CallStaticObjectMethod(clazz, methodID, string1);
methodID = env->GetMethodID(clazz, "toString", "()Ljava/lang/String;");
string1 = (jstring)env->CallObjectMethod(object1, methodID);

clazz = env->FindClass("java/net/URLEncoder");
methodID = env->GetStaticMethodID(clazz, "encode", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;");
string2 = (jstring)env->NewStringUTF("UTF-8");
string3 = (jstring)env->CallStaticObjectMethod(clazz, methodID, string1, string2);


clazz = env->FindClass("java/net/URI");
methodID = env->GetMethodID(clazz, "<init>", "(Ljava/lang/String;)V");
object1 = env->NewObject(clazz, methodID, string3);

clazz = env->FindClass("java/io/File");
methodID = env->GetMethodID(clazz, "<init>", "(Ljava/net/URI;)V");
object2 = env->NewObject(clazz, methodID, object1);

应用程序在最后一次调用NewObject时崩溃。可能的原因是什么?
编辑:
似乎是将jobject作为参数传递给NewObject的问题。正确传递jobject的方法是什么?

第一步是为每个JNI调用添加错误检查(即检查返回值和异常)。 - Michael
我实际上在我的代码中使用错误检查,只是为了让帖子更短而省略了它。 - rxjsisfine
传递jobject没什么特别的。 - Michael
1个回答

0

这与JNI无关。

问题在于没有java.io.File用于可绘制资源。 grass可绘制资源以PNG或其他图像格式嵌入APK中,资源管理器通过直接查看APK提取位图以使用Resources.getDrawable(int)方法。

如果您需要使用文件I/O方法访问位图,则可以通过Resources.openRawResourceFd() 方法进行限制(仅限未压缩的资源)。 您还可以将位图放在资产而不是 res 中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接