如何跨JNI调用使用全局引用

时间:2013-06-16 20:20:17

标签: java android c java-native-interface

我必须在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的错误。我找不到任何关于如何使用全局引用的教程。我发现的那些直接使用全局对象或类。这给了我一个错误。

1 个答案:

答案 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修饰符放在此文件中。