gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:55:47 25 4
gpt4 key购买 nike

我必须在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com