我正在try 使用(Asset NDK apis)从APK中的Assets文件夹读取JSON文件

我使用AAssetManager_fromJava在本机端使用Dalvik AssetManager对象.

但因为我需要在JNI_OnLoad中加载JSON文件,并且它在应用程序组件的onCreate方法之前被调用.在调用getAssets()方法时,我得到了空的NullPointerException(由于android.content.Context为空).

如何解决此问题?

PS:我需要在JNI_OnLoad本身中加载assets资源 ,库应该在静态块中加载,即在调用onCreate之前.

   public class MainActivity extends Activity {

      static {
        System.loadLibrary("nativeLibrary");
      }

     @Override
     protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
     }


     public AssetManager getAssetManager() {
        return getAssets();
     }
    }
jobject getAssetManagerFromJava(JniEnv* env, jobject obj) {

  jclass clazz = env->GetObjectClass(obj);
  jmethodID method = env->GetMethodID(clazz, "getAssetManager", "()Landroid/content/res/AssetManager;");
  jobject ret = env->CallObjectMethod(obj, method);

  return ret;

}
  jobject jam = getAssetManagerFromJava(env, obj);
  AAssetManager* am = AAssetManager_fromJava(env, jam); // am is getting NULL (issue)

推荐答案

我觉得这不可能.JNI_Onload()正在被调用before,应用程序Context已经建立.您将需要重新构建代码,以便延迟对assets资源 的访问,直到应用程序Context已经建立.要做到这一点,您可以执行以下操作之一:

  • Application.onCreate()秒内加载本机库
  • 在您的本机库中添加一个方法,该方法在MainActivity.onCreate()上调用Application.onCreate()以触发读取assets资源
  • 修改本机库中的所有(公共)方法,以便它们首先判断assets资源 是否已被读取,如果它们尚未被读取,则在try 使用它们之前立即读取它们.

Android相关问答推荐

当我的Log.i()不在主线程中时,如何在我的logcat中显示它?

Jetpack Compose Scaffold—content不在TopAppBar下面开始'

如何在Android Emulator上从物理设备接收TCP消息

将Any强制转换为Integer将从API返回NullPointerException

将Android Studio插件复制到离线网络

Android应用程序中的背景问题

对支持哪些数据存储区方法感到困惑

如何在停止和销毁时更改函数中Firebase实时数据库的子项的值我试过了,但这不起作用.请使用Kotlin

在柯特林连续测量网速

OutlinedTextField仅显示一次

如何在 Android Studio 中为带有 Room 的 SQLite 编写需要参数的查询?

只能从同一个库组内调用成功(引用groupId=androidx.work from groupId=My Composable)

为什么@PrimaryKey val id: Int? = null 在创建 Room 实体时有效吗?

未找到 com.android.tools.build:gradle:7.4.0 的匹配变体

为什么项目捕获对象给我在 Compose 中找不到参考

如何在 Jetpack Compose 中设置行宽等于 TextField 的宽度?

Jetpack 组合千位分隔符视觉转换,也适用于小数

Android 自动分页如何与 media3 配合使用?

在 Jetpack Compose 中找不到 Path 的减号()

MVVM - 这个逻辑的最佳层是什么?