如何在 Android NDK 上使用 JNI 在 C 和 Java 之间传递复杂的结构
2022-09-04 04:17:23
我在Android应用程序的C代码中有一个复杂的结构,我想在Java方面使用它。我已经用谷歌和stackoverflow做了一些研究,所以我从我的C strucutre创建了java类,但现在如何在Java中获取它。
我已经找到了这些信息,关于在类中制作指针并在C端使用它:
Get the field ID : (*env)->GetFieldID(...)
Get the pointer : (*env)->GetLongField(...)
Set the pointer : (*env)->SetLongField(...)
但我不明白它是如何工作的...
在上面,你可以找到我到目前为止所做的...没有那么多!在C端:
ComplexStructure Java_com_main_MainActivity_listenUDP(JNIEnv* env, jclass clazz)
{
int i,taille;
ComplexStructure myStruct;
taille = -1;
taille = recvfrom(socket, &myStruct, sizeof(ComplexStructure ), 0, &rcvAddr, &sizeOfSock);
if(taille != -1)
{
return myStruct;
}
return NULL;
}
在Java方面:
public void getFromUDP() {
ComplexClass myClass = new ComplexClass();
myClass = listenUDP();
}
@Override
public void run() {
initUDP();
getFromUDP();
}
public static native ComplexClass listenUDP();
public static native void initUDP();
public static native void closeUDP();
/** Load jni .so on initialization */
static {
System.loadLibrary("native-interface");
}
编辑:我想补充一点,我的结构非常复杂,就像这样:
typedef struct{
TYPE_A myStructA;
TYPE_B myStructB;
TYPE_C myStructC;
TYPE_D myStructD;
}ComplexStructure;
typedef struct{
float rad;
int size;
bool isEmpty;
}TYPE_A;
typedef struct{
float rad;
bool isEmpty;
float color;
int temp;
}TYPE_B;
typedef struct{
int temp;
float rain;
bool isEmpty;
}TYPE_C;
typedef struct{
float rad;
int idPerson;
bool isOnTime;
}TYPE_D;
更复杂的是,只是一个例子来向您展示它是如何的!