我遇到了以下问题。我想编写一个使用我的遗留 C++ 类的 Android 应用程序。我必须在整个应用程序生命周期内保持 C++ 对象处于 Activity 状态。
我用 C# 编写了一个类似的应用程序,并通过将指向 C++ 类的指针传递给 C# 并使用 IntPtr 将其存储在那里来解决了这个问题。然后,当我想调用该对象的方法时,我只需将该指针再次传递给 C++,转换为类指针并调用它的方法。
如何在 Java 和 Android NDK 中获得类似的结果? Java 是否支持存储指针?
最佳答案
是的,您可以执行与在 C# 中所做的完全相同的操作。
创建新的 C++ 对象:
jlong
Java_package_name_new(JNIEnv *, jobject) {
return (long)(new CPP_Object());
}
您可以将此方法的返回值存储在 Java ptr
变量中,并将其传递给所有需要它的 NDK 方法:
void
Java_package_name_doSomething(JNIEnv *, jobject, jlong ptr) {
CPP_Object *obj = (CPP_Object *)ptr;
// do whatever you want with the object
}
最后用类似这样的方式删除它:
void
Java_package_name_delete(JNIEnv *, jobject, jlong ptr) {
delete (CPP_Object *)(ptr);
}
除了将 ptr
传递给所有需要它的方法,您还可以使用 SetLongField
和 GetLongField< 直接从 NDK 部分获取并设置它
方法:这允许仅从代码的 NDK 部分管理 Java ptr
变量,我发现它更安全且更易于管理。
关于java - Android NDK,保持实时 C++ 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19808610/