背景
我有一个 android 项目,它使用 JNI(使用 NDK)以 Java 和 C/C++ 进行编码。
我在java端创建了一个Jni java包装器,它将自己完成所有Jni操作,而除了这个包装器之外,没有其他java类可以直接访问jni操作。
问题
问题是,我希望创建此包装器的多个实例,而 Jni 部分应该为每个 Jni 包装器有一个实例。
这是一个问题,因为 Jni 部分为所有实例保留相同的字段。
问题
我该如何解决这个问题,以便对于 jni 包装器的每个 java 实例,jni 部分都会有一个实例?
我在想,也许我可以将所有字段放入一个 C++ 类中,并有一个 init() 函数,该函数将为 JniWrapper 的 CTOR 返回一个新实例,从那时起,对于每个需要字段的 JNI 函数,它将获取这个类作为参数。也许它可能是一个指针,如图所示这个链接.
可悲的是,我不知道该怎么做。
有人可以帮忙吗?
sample
这是一个示例代码,我希望它能让那些不理解问题的人更清楚:
java部分:
public class JniWrapper
{
static
{
System.loadLibrary("JniTest");
}
private native void foo(Bitmap bitmap);
}
jni部分:
...
// sadly, all of those fields are actually a global fields
int _intField;
float _floatField;
//those are just sample fields. i would also like to store pointers and objects...
JNIEXPORT void JNICALL ...foo(JNIEnv * env, jobject obj, jobject bitmap)
{
// do something with the fields, as if they all belong to the JniWrapper,
// and no other instances of JniWrapper are allowed to change them
}