什么类型的数据可以在预编译的 C++ 和 Java for Android 之间传递?

Posted

技术标签:

【中文标题】什么类型的数据可以在预编译的 C++ 和 Java for Android 之间传递?【英文标题】:What type of data can be passed between pre-compiled C++ and Java for Android? 【发布时间】:2016-12-14 00:24:47 【问题描述】:

我正在开发一个 OpenCV 项目,该项目目前在 python 中进行原型设计,但我想在 android 中工作。

我认为最好从直接 java 开始,然后将其移至 Android,但用于 java 的 OpenCV 似乎不像 Python 和 C++ 那样完全实现(例如,它没有 imshow )。所以现在我不确定从 Python 到 Java 的转换会有多容易。

由于过去我在使用 OpenCV 时从 Python 到 C++ 相对容易,这让我想到了其他选择。我看到您可以在 Android 中运行预编译的 C++ 代码,因此这可能是一种选择。我看到的问题是我不确定我能在多大程度上传递我需要的数据。在 Android Java 和预编译的 C++ 之间进行通信时有哪些限制?并且预编译的 C++ 是否允许访问文件系统,因此它可以读取图像?

【问题讨论】:

【参考方案1】:

您可以传递 java 支持的任何数据。显然你不能按原样传递 C++ 类(尽管你可以传递一个指针,只要保留在 Java 中,然后将它传递回 C++ 可以再次使用它)。

在 C++ 方面,通过 JNI API,您可以使用 Java 代码做所有可以做的事情。但是,这需要额外的工作和对线程绑定、JNI 上下文和 JNI/Java 内存管理的清晰理解。

在 Java 端,您可以将字符串、原始类型(简单)或复杂类型传递给 C 函数,然后使用 JNI 访问字段、调用方法、抛出异常等。

内存管理存在一些陷阱,如果您从 C++/JNI 内部分配 Java 堆,请仔细阅读有关分配、生命周期和引用类型的信息。

Android 特有的,您可能还想阅读一些JNI Tips

Android 本机至少可以使用与常规 Android Java apk 相同的功能来访问 IO 和文件系统。您可以在这里查看示例和讨论File Operations in Android NDK

【讨论】:

以上是关于什么类型的数据可以在预编译的 C++ 和 Java for Android 之间传递?的主要内容,如果未能解决你的问题,请参考以下文章

VBS和JAVA和C++,有啥区别,有啥差距

为什么这些头只能在预编译头之外工作?

我们为啥要用Java?

C++知识点整理

C++数据类型(data type)介绍

C++中引用和匿名对象的理解和本质剖析