gpt4 book ai didi

java - JNI - 如何使用具有不同字段的多个 Jni 包装器实例?

转载 作者:行者123 更新时间:2023-11-30 04:18:05 26 4
gpt4 key购买 nike

背景

我有一个 android 项目,它使用 JNI(使用 NDK)以 Java 和 C/C++ 进行编码。

我在java端创建了一个Jni java包装器,它将自己完成所有Jni操作,而除了这个包装器之外,没有其他java类可以直接访问jni操作。

问题

问题是,我希望创建此包装器的多个实例,而 Jni 部分应该为每个 Jni 包装器有一个实例。

这是一个问题,因为 Jni 部分为所有实例保留相同的字段。

问题

我该如何解决这个问题,以便对于 jni 包装器的每个 java 实例,jni 部分都会有一个实例?

我在想,也许我可以将所有字段放入一个 C++ 类中,并有一个 init() 函数,该函数将为 JniWrapper 的 CTOR 返回一个新实例,从那时起,对于每个 JNI 函数需要字段,它将获取此类作为参数。也许它可能是一个指针,如 this link 所示。 .

可悲的是,我不知道该怎么做。

有人可以帮忙吗?

示例

这是一个示例代码,我希望它能让那些不理解问题的人更清楚:

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
}

最佳答案

您需要在 JNI 端拥有 C++ 类,并且需要将 C++ 类的实例与 JNI 包装器类的每个实例相关联。您需要将 native 方法添加到 newdelete C++ 类实例,并且您将需要一种万无一失的方法来确保 delete每次释放 JNI 包装类的实例时都会调用 >-calling 方法,例如通过 close() 方法、finally{} block ,甚至 finalize() 方法:这是其使用合法的一种情况。您需要在每个 Java 实例中存储一个指向 C++ 实例的指针,例如作为 Java long,您需要在 C++ 端获取它并将其转换为 C++ 类实例以获取每个实例的数据。

关于java - JNI - 如何使用具有不同字段的多个 Jni 包装器实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17844733/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com