背景
我有一个使用 JNI(使用 NDK)在 Java 和 C/C++ 中编码的 android 项目。
我在 java 端创建了一个 Jni java 包装器,它将自己完成所有 Jni 操作,而除了这个包装器之外,没有其他 java 类可以直接访问 jni 操作。
问题
问题是,我希望创建这个包装器的多个实例,而 Jni 部分应该有每个 Jni 包装器的实例。
这是一个问题,因为 Jni 部分为所有实例保存相同的字段。
问题
我该如何解决这个问题,以便对于 jni 包装器的每个 java 实例,在 jni 部分上都会有一个实例?
我在想,也许我可以将所有字段放入一个 C++ 类中,并有一个 init() 函数,该函数将为 JniWrapper 的 CTOR 返回它的一个新实例,从那时起,对于每个需要字段的 JNI 函数,它将获取此类作为参数。也许它可能是这个链接上显示的指针。
可悲的是,我不知道该怎么做。
有人可以帮忙吗?
样本
这是一个示例代码,我希望能让那些不理解这个问题的人更清楚:
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
}