2012-08-02 72 views
4

我试图使用JNI将一些数据从C++发送到java。JNI:如何将一组数据从C++转换为Java

在C++中,我有:

 
Array[0]: 
string name = "myName" 
int iterations = 16 
float value = 15 
... etc

所以我想用JNI来返回Java中所有的数据,我想这一点,但不工作

 
JNIEXPORT jobjectArray JNICALL Java_com_testing_data_MainActivity_getDATA(JNIEnv *env, jobject obj) 
{ 
// 1º Create a temp object 
jobject dataClass 
    { 
     jstring name; 
       jint iterations; 
       jfloat value; 
    };

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

}

这是正确的步骤来返回一个结构/对象的数据?如何解决这些错误?

+1

NewObjectArray的第二个参数必须是java类引用,并且通过执行env-> FindClass(“fullpackagelevelnameofyourjavalclass”); – jogabonito 2012-08-03 09:45:35

+0

尝试序列化数据或json字符串 – texasbruce 2012-08-03 10:04:51

+0

您不能像在C中那样定义一个Java类。您应该看到的是Java中的一个类,如下所示: 'class MyData {String name;整数迭代;浮动值; MyData(String name,int iterations,float value){this.name = name; this.iterations =迭代; this.value = value; }}' – oldrinb 2012-08-04 03:02:45

回答

3

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

+0

我不知道同辈班,非常感谢。 – vgonisanz 2012-08-06 08:15:03

+0

不客气。请注意,32位和64位操作系统的指针类型可能不同。 – qrtt1 2012-08-06 12:42:48

0

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

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

通行证此序列到Java则将其分解,从而获得所需的值。使用String.split()StringTokenizer