簡體   English   中英

如何使用Jni將結構從C代碼傳遞到Java

[英]how to pass structure from c code to java using Jni

我必須通過一個結構

   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;

我想將此(Info)結構傳遞給我的Java代碼。我已經掃了一眼,但沒有獲得完成此操作的完整方法。

謝謝。

該結構必須在Java端定義為帶有成員的類。 事實上,JNI允許C訪問Java對象,但不允許Java訪問C對象(結構) 因此,如果您想通過JNI“傳遞”某些東西並讓它可以在兩端訪問,那么它必須是一個Java對象,然后在界面中被限定為jobject 從C端開始,您有兩個選擇:

  • 要么使用GetFieldID()Get/Set<Type>Field直接訪問成員,盡管數組更復雜(我看到了一些)
  • 或者在該類中創建Java方法以便以簡化方式填充和讀取,並使用Invoke<Retval>Method調用它們

這取決於數據存儲的設計。 您可能只想要一面(C或Java)讀取而另一面寫入,這可以方便地反映在設計中。

編輯:

可以在@asgoth指出的站點上找到示例: www.steveolyo.com 有一章名為“將C結構從C傳遞到Java”,然后它靜靜地解釋了如何在Java類中反映所需的C結構並通過JNI將Java對象傳遞給C - 這正是我的回答所說的。

你需要一個JNIEXPORT:

JNIEXPORT jint JNICALL 
Java_FillCStruct
(
   JNIEnv *env, 
   jclass obj, 
   jobject    info      // EntryInformation object instantiation
)
{
   testInfo entryInfo;
   jclass clazz;
   jfieldID fid;
   jmethodID mid;

   GetInfo(entryInfo);   // fills in the entryInfo

   clazz = (*env)->GetObjectClass(env, info);
   if (0 == clazz)
   {
      printf("GetObjectClass returned 0\n");
      return(-1);
   }
   fid = (*env)->GetFieldID(env,clazz,"index","I");

   // This next line is where the power is hidden. Directly change
   // even private fields within java objects. Nasty!
   (*env)->SetIntField(env,info,fid,testInfo.index); 
...

這是一個帶有一些示例的網站: http : //www.steveolyo.com/JNI/JNI.html

您已經知道映射只能以一種方式工作:您可以從C / C ++訪問Java類,但反之亦然。

但是也要記住,這種映射會涉及大量的開銷-使用的內存和CPU都非常重要。

因此,放棄完全透明度可能是不可能的。 例如,如果您只需要讀取activeInfo [n] .s,則可以編寫本機方法getais(int n)。 或者你可以在java中作為DirectByteBuffer接收整個結構,計算所需的偏移量,並直接操作該值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM