【问题标题】:How to transfer a C structure to java by use of JNI?如何使用 JNI 将 C 结构传输到 java?
【发布时间】:2011-01-11 10:15:26
【问题描述】:

我正在从 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);
}

提前感谢您的帮助。
史蒂芬

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我建议返回一个 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);
      

      【讨论】:

      • 谢谢弗拉基米尔。与示例中的结构相比,结构有点复杂,我需要使用它。但是如何从 C 函数中的结构访问 java 对象以使用 setter 和 getter(按照示例)?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多