【问题标题】:Store obejcts/strings in CPP jni在 CPP jni 中存储对象/字符串
【发布时间】:2020-12-21 05:57:28
【问题描述】:

在编写 Android 代码时,在 cpp 中保留内容的最佳方法是什么。我在每个帧上运行一些 OpenCV 代码。我有多个我想保留的对象,我并不总是想重新创建。例如路径之类的字符串,OpenCV 人脸检测器类。目前我只保留一个类,并将它作为指针从 Java 传递到 CPP。但现在我想添加更多内容,这似乎不是一个好主意。

关于如何有效解决这个问题的任何提示?

目前我正在做类似的事情:Android NDK, keeping live C++ objects

我以前不是该解决方案的粉丝,但现在我想要多个对象,这会使代码更加混乱

【问题讨论】:

  • C++ 对象还是 Java 对象?请提供minimal reproducible example
  • 我有 C++ 对象。我添加了一个链接来描述我目前在做什么
  • 那个问题中有什么不能回答你的问题?
  • 所以现在如果我有 5 个不同的检测器,我将为每个检测器调用 JNI 来创建和删除它们。并且还传递它们。或者我把所有东西都放在一个中,但是如果我想禁用其中一个会发生什么。似乎不是很灵活的解决方案

标签: java android c++ java-native-interface


【解决方案1】:

您可以创建一个 C++ 类来保存您需要的所有对象作为成员。

头文件:

class MyCppClass
{
public:
    MyCppClass();
    ~MyCppClass();
    //Any other methods you need

    std::string mPath;
    //Any other member variables
}

源文件:

static MyCppClass gMyClass;

//JNI
extern "C" 
{
    //Your JNI functions can use gMyClass
    void
    Java_package_name_initPath(JNIEnv *env, jobject obj, jstring jPath) 
    {
        const char* pPath = env->GetStringUTFChars(jPath, JNI_FALSE);
        gMyClass.mPath = pPath; //Of course you can use setters/getters if you want
        env->ReleaseStringUTFChars(jPath, pPath);
    }
}

//MyCppClass implementation
MyCppClass::MyCppClass()
{
    //...
}

现在您的 gMyClass 对象包含路径作为成员,您不必在本机和 Java 之间来回传递它。

【讨论】:

  • 感谢您的想法。是的,我最终得到了类似的东西。我有一个永久类,它包含所有类和字符串以及永久成员。我还发现您实际上不需要将类发送回 Java 以使其保持活动状态,但您可以使用静态。 static PermanentClass* perm_class = nullptr;
猜你喜欢
  • 2019-02-01
  • 1970-01-01
  • 2013-07-04
  • 1970-01-01
  • 2013-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-20
相关资源
最近更新 更多