0

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

4

1 回答 1

2

我曾尝试在另一个函数中直接使用 globalManager ,但这给了我 globalManager 未在此范围内定义的错误。

您的问题实际上是关于 C 中全局变量的概念,而不是全局 JNI 引用。您定义了在函数中调用static的类型变量。这意味着该变量在函数的多次调用中保持其值,但它仍然不是全局定义的。您只能从函数内部访问它。要在其他函数中使用它,您必须全局定义变量,如下所示:jobjectglobalManager 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修饰符放入此文件中。

于 2013-06-17T13:57:26.957 回答