我必须在Android中使用assetmanager来打开一些文件。我正在使用Assetmanager打开一个lua文件。为此,我使用AAssetmanager在JNI中的init函数中创建了一个luastate。然后我使用这个luastate调用我的lua文件中的函数。但是,我正在运行一个图像处理应用程序,需要为每一帧减慢打开和关闭此luastate。
我目前正在这样做 -
JNIEXPORT jstring JNICALL
Java_com_torch_torchdemo_TorchDemo_callTorch( JNIEnv* env,
jobject thiz,
jobject assetManager) {
// get native asset manager
static jobject globalManager = env->NewGlobalRef(assetManager);
AAssetManager* manager = AAssetManager_fromJava(env, globalManager);
assert( NULL != manager);
lua_State *L = initstate(manager)
char file[] = "main.lua";
int ret;
long size = android_asset_get_size(file);
lua_getglobal(L,"test_func");
return nev->NewStringUTF(buffeR);
}
在此之后,我不知道如何在另一个jni函数中使用globalManager对象,我将重复调用它。上面的那个只会被调用一次。我已尝试在另一个函数中直接使用globalManager,但这给了我在此范围内未定义globalManager的错误。我找不到任何关于如何使用全局引用的教程。我发现的那些直接使用全局对象或类。这给了我一个错误。
答案 0 :(得分:2)
我已尝试在另一个函数中直接使用globalManager,但这给了我在此范围内未定义globalManager的错误。
您的问题实际上是关于C中全局变量的概念而不是全局JNI引用。您在函数static
中定义了名为jobject
的globalManager
类型Java_com_torch_torchdemo_TorchDemo_callTorch
变量。这意味着变量在函数的多次调用中保持其值,但仍未全局定义。您只能从函数中访问它。要在其他函数中使用它,您必须全局定义变量,如下所示:
// define it as a global variable
static jobject globalManager;
JNIEXPORT jstring JNICALL Java_com_torch_torchdemo_TorchDemo_callTorch(JNIEnv* env, jobject thiz, jobject assetManager) {
// get native asset manager
globalManager = env->NewGlobalRef(assetManager);
// ...
}
如果您还想从其他源文件访问变量,则必须在那里使用extern
声明,并将static
修饰符放在此文件中。