【发布时间】: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元素。