簡體   English   中英

多次加載本機庫

[英]Load a native library multiple times

我已經制作了一個簡單的本機庫,可以存儲整數並將其返回。

#include <string.h>
#include <jni.h>
static int a;

void Java_com_example_testnativelibs_TestClass_setA(JNIEnv* env, jobject javaThis, jint val){
    a = val;
}
jint Java_com_example_testnativelibs_TestClass_getA(JNIEnv* env, jobject javaThis) {
      return a;
}

這是TestClass代碼:

public class TestClass {
    public TestClass() {
        System.loadLibrary("ndkfoo2");
    }
public native void setA(int val);
public native int getA();
}

然后是我的MainActivity的代碼:

TestClass a = new TestClass();
TestClass b = new TestClass();
a.setA(5);
b.setA(2);
Log.i("A VALUE",""+a.getA());
Log.i("B VALUE",""+b.getA());

值2在日志中顯示兩次,這意味着該庫僅加載一次,並且由同一類的所有實例“共享”。 是否可以多次加載它,每個類實例一次加載?

不能。Linux(Android)上的共享庫僅一次加載到一個進程中。 這就是為什么您應該很少,很少使用共享庫中的全局數據的原因-該數據在整個過程中都是全局的。

相反,您的庫應該產生並使用某種“狀態”變量(結構,指針等),以在其函數調用之間跟蹤數據。


不幸的是,我從未使用過JNI,因此我不知道相關的API調用來完成此操作。

在普通的Linux中,您可能會遇到以下情況:

公開頭文件

typedef void* PublicState;  // Don't let consumers know anything about the
                            // state that we're keeping.

PublicState MyLib_init();
void        MyLib_free(PublicState state)
int         MyLib_getVal(PublicState state);

私有C實現文件

// This is the actual "state" object we keep track of information with.
typedef struct _PrivateState {
    int a;
} PrivateState;


PublicState MyLib_init() {
    PrivateState* state = malloc( sizeof(PrivateState) );
    // check for errors

    state->a = 42;

    return (PublicState)state;
}

int MyLib_getVal(PublicState state) {
    PrivateState* ps = (PrivateState*)state;

    return ps->a;
}

void MyLib_free(PublicState state) {
    // any other cleanup
    free(state);
}

我什至不知道這是否是您在JNI中“應該”執行的方式。

也可以看看:

暫無
暫無

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

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