使用 Kotlin 和 Android NDK C++ 的 Android 资产 FileNotFound 异常
我正在尝试通过将 AssetManager
对象从我的kotlin脚本传递到jni接口,在资产/
文件夹中读取 .obj
文件。可以使用C ++来解析 .obj
文件,然后将其添加到我的OpenGL场景中。但是该应用程序没有在我的资产文件夹中找到任何文件。
我抓住了AssetManager,并尝试将其传递给渲染器类内部的JNI,在 onSurfaceCecreated
callback:
kotlin文件:
private external fun loadModels(assetManager: AssetManager): Void //Loaded correctly from companion object
private lateinit var manager: AssetManager
override fun onSurfaceCreated(unused: GL10, config: EGLConfig?) {
manager = Resources.getSystem().assets //Gets the asset manager (poorly documented)
loadModels(manager)
manager.open("hello.txt") //Throws FileNotFoundException
}
C ++文件:C ++文件:
#include <jni.h>
#include <android/log.h>
#include <android/asset_manager.h>
#include <android/asset_manager_jni.h>
extern "C" JNIEXPORT jobject JNICALL
Java_com_example_mypackage_glRenderer_loadModels(JNIEnv *env, jobject thiz, jobject asset_manager) {
AAssetManager* pAssetManager = AAssetManager_fromJava(env, asset_manager);
if (pAssetManager == nullptr) {
__android_log_print(ANDROID_LOG_ERROR, "GL_JNIConnector.cpp", "Failed to load asset manager");
//Break
exit(1);
}
//Loop through all files in Models folder
AAssetDir* pModelsDirectory = AAssetManager_openDir(pAssetManager, "Models/");
//AAssetDir_rewind(pModelsDirectory);
const char* filename = AAssetDir_getNextFileName(pModelsDirectory); //Incorrectly returns NULL
__android_log_print(ANDROID_LOG_DEBUG, "GL_JNIConnector.cpp", "%s", filename);
}
但是我的 aassetdir_getnexnextfilectfilename(pmodelsdirectory)(pmodelsdirectory)保持返回
null
,当我的资产文件夹中存在文件时,解压缩.APK文件也显示它们已正确添加到应用程序中。
我通过编造 Hello.txt
文件,然后尝试使用 Manager.open(“ Hello..txt”)
在Kotlin中对其进行了测试。 a filenotfoundException
这是我的目录:
用Android Studio拆开APK,在 .apk
文件
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
问题是我使用了我的资产管理器
,它只能让我访问系统资源,而不能访问应用程序资源。相反,我应该将上下文从表面视图类传递到渲染器类,
以便我可以简单地使用我的资产管理器
感谢@Michael 指出这一点
The issue was I grabbed my asset manager using
which only gets me access to system resources, not application resources. Instead, I should have passed my context from my surface view class to the renderer class
so that I could get my asset manager simply using
Thanks to @Michael for pointing that out