JNI:如何将一组数据从 c++ 转换为 Java

Posted

技术标签:

【中文标题】JNI:如何将一组数据从 c++ 转换为 Java【英文标题】:JNI: How to convert a group of data from c++ to Java 【发布时间】:2012-07-31 07:07:38 【问题描述】:

我正在尝试使用 JNI 将一些数据从 c++ 发送到 java。

在 c++ 中我有:

数组[0]: 字符串名称 = “我的名字” 整数迭代 = 16 浮点值 = 15 ...等

所以我想使用 JNI 返回 Java 上的所有数据,我正在尝试这个,但不起作用

JNIEXPORT jobjectArray JNICALL Java_com_testing_data_MainActivity_getDATA(JNIEnv *env, jobject obj) // 1º 创建一个临时对象 作业数据类 jstring名称; 联合迭代; j浮点值; ; jobject tempObject = env->NewObject(); // Get data in c++ format int temp object type std::vector<dataClass > data = getDataClass(); // First error, must be a c++ class, how could i get it? // How much memory i need? int dataSize = data.size(); // Reserve memory in java format jint tempValues[dataSize]; jobjectArray tempArray = env->NewObjectArray(dataSize,dataClass,0); // 2º Error, it doesn 't create the class // Temporal store data in jarray for (int i = 0; i < dataSize ; i++) tempArray[i].name = data[i].name; tempArray[i].iterations = data[i].iterations; tempArray[i].value = data[i].value; return tempArray; // return temp array

返回带有数据的结构/对象的这些步骤是否正确?如何修复这些错误?

【问题讨论】:

NewObjectArray 的第二个参数,必须是 java 类引用,你可以通过 env->FindClass("fullpackagelevelnameofyourjavalclass"); 尝试序列化数据,或者json字符串 您不能在 C 中定义这样的 Java 类。您应该研究的是 Java 中的类,例如:class MyData String name; int iterations; float value; MyData(String name, int iterations, float value) this.name = name; this.iterations = iterations; this.value = value; 然后您可以使用您的信息实例化该类,以便通过NewObject 填充您的Java 数组。您可以通过SetObjectArrayElement从构造的jobjects 中设置jobjectArray 元素。 【参考方案1】:

您可以使用字符串将所有数据存储为序列数据。字段由分隔符分隔(例如“:”),如下所示:

std::string sequenceData = "my name" + ":" + "16" + ":" + "15" + ...;

将此序列传递给 java,然后将其拆分以获得所需的值。使用String.split()StringTokenizer

【讨论】:

【参考方案2】:

将所有内容都转换为 JNI 类型并不是一个好主意。通常,最好创建一个对等对象,即指向本机资源的句柄指针 - 就像 Windows GUI 编程中的 hWnd。

【讨论】:

不客气。请注意指针类型可能在 32 位和 64 位操作系统之间有所不同。

以上是关于JNI:如何将一组数据从 c++ 转换为 Java的主要内容,如果未能解决你的问题,请参考以下文章

如何将从 C++ 发送的 cv::MAT 字节数组转换为 Java 中的位图?

我可以使用 Java 8 的 stream() 将一组非原始项转换为列表吗? [复制]

如何从swift将一组浮点数组传递给C++函数

如何将一组 java 对象表示为数据库中其他对象的字段?

将 JNI -> jobject(基本上是映射和/或 java 文件中的映射)转换为 std::map(c++)

C ++中的JNI将文件读取到jbyteArray