2

構造体を渡す必要があります

   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コードに渡したいのですが、ゴーグルしましたが、これを行うための完全な方法が得られていません。

ありがとう。

4

3 に答える 3

4

構造体は、メンバーを持つクラスとしてJava側で定義する必要があります。実際、JNIはCがJavaオブジェクトにアクセスすることを許可しますが、JavaがCオブジェクト(構造体)にアクセスすることを許可しません。したがって、JNIを介して何かを「パス」し、両側からアクセスできるようにする場合は、Javaオブジェクトである必要がありjobject、インターフェースのように修飾されている必要があります。C側からは、次の2つのオプションがあります。

  • とを使用してメンバーに直接アクセスしますが、配列を使用するGetFieldID()Get/Set<Type>Fieldより複雑になります(私が見たものもあります)
  • または、そのクラスにJavaメソッドを作成して、単純化された方法で入力および読み取りを行い、それらを次のように呼び出します。Invoke<Retval>Method

データストレージの設計によって異なります。おそらく、片側(CまたはJava)だけを読み取り、もう一方を書き込みたい場合があります。これは、デザインに簡単に反映できます。

編集:

例は、@ asgothによって指摘されたサイトで見つけることができます:www.steveolyo.com。「CからJavaへのC構造体の受け渡し」という章がありますが、必要なC構造体をJavaクラスに反映し、JNIを介してJavaオブジェクトをCに渡す方法を黙って説明しています。

于 2012-12-21T13:04:23.257 に答える
2

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

于 2012-12-21T10:47:01.747 に答える
1

マッピングが一方向にしか機能しないことはすでにご存知でしょう。C/C++からJavaクラスにアクセスできますが、その逆はできません。

ただし、このようなマッピングには、使用されるメモリとCPUの両方でかなりのオーバーヘッドが伴うことを覚えておくことも重要です。

したがって、完全な透明性をあきらめるのは賢明かもしれません。たとえば、activeInfo [n] .sのみを読み取る必要がある場合は、ネイティブメソッドgetais(int n)を記述できます。または、uouはJavaで構造全体をDirectByteBufferとして受け取り、必要なオフセットを計算して、値を直接操作することができます。

于 2012-12-21T19:05:48.243 に答える