如何使用Jni将结构从c代码传递到java

Raj*_*dra 3 java java-native-interface android-ndk

我必须通过一个结构

   struct Info {
    u_int8_t timestamp[8];
    u_int32_t  a;
    u_int32_t  b;
    u_int32_t  c;
    ActiveInfo activeInfo[MAX_ACTIVE_SET];

   };

 struct ActiveInfo
{
   u_int8_t  is_reference;
   u_int16_t p;
   u_int32_t q;
    u_int8_t  r;
   u_int8_t  s;
  };
  typedef struct ActiveInfo ActiveInfo;
Run Code Online (Sandbox Code Playgroud)

我想将这个(信息)结构传递给我的java代码。我已经仔细研究过,但没有得到完整的方法来做到这一点。

谢谢。

Pav*_*nek 5

该结构必须在 Java 端定义为具有成员的类。事实上,JNI允许C访问Java对象,但不允许Java访问C对象(结构体)。因此,如果您想通过 JNI“传递”某些内容并使其在两端都可访问,那么它必须是一个 Java 对象,然后按照jobject接口中的方式进行限定。从C端来看,你有两个选择:

  • GetFieldID()要么直接使用and访问成员Get/Set<Type>Field,尽管数组更复杂(我看到了一些)
  • 或者在该类中创建 Java 方法,以简化的方式填充和读取,并使用以下命令调用它们Invoke<Retval>Method

这取决于您的数据存储的设计。你也许只想一侧(C或Java)读,另一侧写,这可以方便地体现在设计中。

编辑:

示例可以在 @asgoth 指出的网站上找到:www.steveolyo.com。有一个章节名为“将 C 结构从 C 传递到 Java”,但它默默地解释了如何在 Java 类中反映所需的 C 结构并通过 JNI 将 Java 对象传递到 C - 这正是我的回复所说的。