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

}

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

回答(2)

2 years ago

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

2 years ago

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

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

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