如何使用JNI将C结构传递给java?

时间:2011-01-11 10:15:27

标签: java c data-structures java-native-interface

从C我创建一个用Java加载的DLL。 我从java调用一些C函数,并从C调用Java函数(有非复杂的数据类型) - 这很好。

我很难将C结构转移到Java。

这是一个描述我想做什么的小例子。 它不完整,可能不正确,因为我的问题是我不知道该怎么做。

我的目标是将结构从“StructType”类型从C传递到Java,以便使用Java程序中的值。

在C

typedef struct {
  unsigned char value1;
  unsigned char value2;
} StructType;

void passStructToJava(StructType* myStruct)
{
  class cls;
  jmethodID mid;

  /* GlobalEnv, GlobalObj are globlal values which are already set */
  cls = (*GlobalEnv)->GetObjectClass(GlobalEnv, GlobalObj); 
  mid = (*GlobalEnv)->GetMethodID(GlobalEnv, cls, "receiveStructFromC", "(LPackage/StructType;)V");

  (*GlobalEnv)->CallVoidMethod(GlobalEnv, GlobalObj, mid, myStruct);
}

在Java中

 public class StructType {
 public int value1; /* int because there is no uint8 type */
 public int value2;
}

public StructType mMyStruct;
public StructType getMyStruct() {
  return mMyStruct;
}
public void setMyStruct(StructType myStruct) {
  mMyStruct = myStruct;
}


public void receiveStructFromC(StructType myStruct)
{
  setMyStruct(myStruct);
}

提前感谢您的帮助。
斯特芬

2 个答案:

答案 0 :(得分:1)

在此问题中查看我的帖子:pass data between Java and C

答案 1 :(得分:0)

我建议返回一个int数组,只要你的结构不包含任何其他东西。

至于返回对象:您可以创建StructType类的对象,使用setter填充值并将其返回。

可以找到必要的代码示例here

就是这个例子,我没有检查这段代码。

returnObj = (*env)->AllocObject(env, objClass);
if (returnObj == 0) printf("NULL RETURNED in AllocObject()\n");
printf("Sizeof returnObj = %d\n", sizeof(returnObj) );

(*env)->SetObjectField (env, returnObj, fid5,
combinedEmployeeNameJava);
(*env)->SetIntField (env, returnObj, fid6, combinedSalary);