[英]Where to load a native library in Android if required by multiple activies and services
[英]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.