簡體   English   中英

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

[英]How do I use a global reference across JNI calls

我必須在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的錯誤。 我找不到任何關於如何使用全局引用的教程。 我發現的那些直接使用全局對象或類。 這給了我一個錯誤。

我已嘗試在另一個函數中直接使用globalManager,但這給了我在此范圍內未定義globalManager的錯誤。

您的問題實際上是關於C中全局變量的概念而不是全局JNI引用。 在函數Java_com_torch_torchdemo_TorchDemo_callTorch定義了一個名為globalManager jobject類型的static變量。 這意味着變量在函數的多次調用中保持其值,但仍未全局定義。 您只能從函數中訪問它。 要在其他函數中使用它,您必須全局定義變量,如下所示:

// 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修飾符放在此文件中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM