我必须在 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 未在此范围内定义的错误。我也找不到任何关于如何使用全局引用的教程。我找到的直接使用全局对象或类。这给了我一个错误。
最佳答案
I have tried directly using globalManager in another function but that gives me the error that globalManager was not defined in this scope.
您的问题实际上是关于 C 中全局变量的概念,而不是全局 JNI 引用。您在 Java_com_torch_torchdemo_TorchDemo_callTorch
函数中定义了一个类型为 jobject
的 static
变量,名为 globalManager
。这意味着该变量在函数的多次调用中保持其值,但它仍然没有全局定义。您只能从函数内部访问它。要在其他函数中使用它,您必须全局定义变量,如下所示:
// 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
修饰符。
关于java - 如何在 JNI 调用中使用全局引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17137325/