java - 如何在 JNI 调用中使用全局引用

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

最佳答案

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 函数中定义了一个类型为 jobjectstatic 变量,名为 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/

相关文章:

Java Android 为什么删除图片不删除

java - 为什么在使用多线程方法后我的 GUITAR 仍然卡住?

java - 如何制作对话框 "You are using 3G. Connect to WiFi"?

android - .htaccess HTTP_USER_AGENT 不起作用

Android 交互通知

c - 字符串或不同语句代码中的隐藏或特殊字符

java - 将 X 小时添加到日期和时间

android - 位图内存不足错误

c - 使用C中的循环制作x的楼梯,但我不断得到正方形

c - 如何避免分配到堆