2

カーネルモジュールを呼び出すCコードがあり、それに構造体を渡したい。これは実行可能のようですex-- charデバイスは複数の(int)ioctl-argumentsをキャッチします

ただし、JavaJNIを介してcコードを呼び出しています。C構造体のマッピングはJavaオブジェクトへのマッピングであると言われていました。したがって、オブジェクトをCネイティブ関数に渡します。

これが私のJNIc関数です

  JNIEXPORT jint JNICALL Java_com_context_test_ModCallLib_reNice
  (JNIEnv *env, jclass clazz, jobject obj){

     // convert objcet to struct  
     // call module through IOCTL passing struct as the parameter
  }

objから構造体を取得するにはどうすればよいですか?

編集:これが私が渡しているオブジェクトです、

class Nice{

    int[] pids;
    int niceVal;

    Nice(List<Integer> pID, int n){
        pids = new int[pID.size()];
        for (int i=0; i < pids.length; i++)
        {
            pids[i] = pID.get(i).intValue();
        }
        niceVal = n;
    }
}

私が欲しい構造体はこれです、

struct mesg {
     int pids[size_of_pids];
     int niceVal;
};

どのようにアプローチすればよいですか?

4

2 に答える 2

1

フィールドにアクセスするには、JNIメソッドを使用する必要があります。次に例を示します。

//access field s in the object
jfieldID fid = (env)->GetFieldID(clazz, "s", "Ljava/lang/String;");
if (fid == NULL) {
    return; /* failed to find the field */
}

jstring jstr = (env)->GetObjectField(obj, fid);
jboolean iscopy;
const char *str = (env)->GetStringUTFChars(jstr, &iscopy);
if (str == NULL) {
    return; // usually this means out of memory
}

//use your string
...

(env)->ReleaseStringUTFChars(jstr, str);

...

//access integer field val in the object
jfieldID ifld = (env)->GetFieldID(clazz, "val", "I");
if (ifld == NULL) {
    return; /* failed to find the field */
}
jint ival = env->GetIntField(obj, ifld);
int value = (int)ival;

JNIEnvクラスには、クラスのメンバー変数の読み取りと変更、メソッドの呼び出し、さらには新しいクラスの作成など、必要なことをすべて実行するためのメンバー関数があります。詳細については、JNI仕様を参照してください。

于 2012-08-24T14:10:25.397 に答える
0

オブジェクトからフィールドを手動でコピーする必要があります。JNIメソッドを呼び出して、フィールドの値を名前で取得できます。オブジェクトを渡すよりも、フィールド自体をメソッドに渡す方が簡単な場合があります。

于 2012-08-24T14:01:55.207 に答える