java - Android NDK,保持实时 C++ 对象

标签 java android c++ android-ndk

我遇到了以下问题。我想编写一个使用我的遗留 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 传递给所有需要它的方法,您还可以使用 SetLongFieldGetLongField< 直接从 NDK 部分获取并设置它 方法:这允许仅从代码的 NDK 部分管理 Java ptr 变量,我发现它更安全且更易于管理。

关于java - Android NDK,保持实时 C++ 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19808610/

相关文章:

java - System.loadLibrary() 在某些情况下不工作

java - 从类内部调用类

java - 通过 Retrofit2 上传 Base64 编码图像返回空响应

java - 检查 10 位数字后的小数 - substring(i,1) 不工作

android - 将安卓应用程序转换为ios

c++ - 关于虚函数模板化的问题

java - Solr 查询返回一个字段的部分匹配项,而不是另一字段

java - 请求 dto 类中的 BigDecimal 属性始终映射 null,无论 API 请求中传递什么内容

c++ - 当程序尝试读取控制台输入时,ddd 调试器进入无限循环

c++ - 断点栏上的 Visual Studio 2017 不可见断点