2013-06-01 56 views
0

我制作了一个简单的本机库,可以存储整数并将其返回。多次加载本机库

#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,则这意味着库仅加载一次,并且由同一类的所有实例“共享”。是否可以多次加载,每个类实例一个?

回答

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中“应该”这样做的方式。

另请参见:

+1

我补充说,说说这几个链接,太。 –