【问题标题】:File from resource Uri in JNI来自 JNI 中资源 Uri 的文件
【发布时间】:2023-03-11 05:40:02
【问题描述】:

您好,我正在尝试从可绘制资源的 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 传递给NewObject 的正确方法是什么?

【问题讨论】:

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

标签: java android android-ndk java-native-interface uri


【解决方案1】:

这与 JNI 无关。

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

如果您需要使用文件 i/o 方法访问您的位图,您可以获得的最接近的方法是彻底的Resources.openRawResourceFd() 方法(仅限于未压缩的资源)。您也可以将位图放入 assets 而不是 res。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多