2017-04-03 17 views
1

こんにちは、私はJNIの質問がある、私はクラスが怒っている。ユーザー空間のUserConfigクラスに変数a、b、c、dを設定しました。クラス内のクラスの配列内の変数にアクセスするJNI

public class SetConfig extends Config { 
    int status; 

    public native int setConfig_IOCTL(); 

} 

public class Config { 
    public Config() { User = new UserConfig[100]; } 

    int number; 

    UserConfig[] user; 
} 

public class UserConfig { 
    int a; 
    int b; 
    int c; 
    int d; 
} 

私はその後、その後、カーネルドライバに渡されるCの構造体に変数を割り当てます。

typedef struct { 
    int status; 
    Config_t config; 
} getConfig; 

typedef struct { 
    int number; 
    UserConfig_t userConfig[100]; 
} Config_t; 

typedef struct { 
    int a; 
    int b; 
    int c; 
    int d; 
} UserConfig_t; 

私は正しくUserConfigをクラス内のフィールドにアクセスするためのフィールド識別子を取得して問題を抱えていて、正しい方向に私を指すようにいくつかの助けを探していました。

私はこれが間違っていることを知っています。私はJNIを使​​用して開始しているよう

JNIEXPORT jint JNICALL com_example_test_Config_config_IOCTL(JNIEnv *env, jobject instance) { 

    getConfig_t tempConfig; 

    jclass thisClass = (*env)->GetObjectClass(env, instance); 
    jfieldID fid = (*env)->GetFieldID(env, thisClass, "a", "[LTest/jni/UserConfig;"); 
    tempConfig.config.userConfig[0] = (*env)->GetIntField(instance, fid); 

} 

任意の助けいただければ幸いです。

答えて

2

C関数の名前はメソッドcom.example.test.Config.config_IOCTL()と関連付けられますが、実際のネイティブメソッドは<some_package>.SetConfig.setConfig_IOCTL()です。クラス名もメソッド名も一致しません。 javahユーティリティを使用すると、Javaクラスのネイティブ・メソッド宣言に対応する適切なC宣言を生成できます。

  • はのjclassを取得:

    正しく持つJavaのネイティブメソッドの宣言にC関数宣言にマッチした、あなたは、次の操作を行うために(それが現在宣言されているとして)ネイティブメソッドが必要になるだろうすでに行っているように、メソッドが呼び出されるオブジェクト

  • Sオブジェクトの所望のフィールドfieldIdsを探すGetObjectArrayElement()
  • 介し配列の所望の要素(?)を取得
  • そのオブジェクト(UserConfig[])のuserフィールドに対応するjobjectarrayを取得これらfieldIDs「クラス
  • 使用することは、それはかなり厄介だ、

全体のフィールドの値を取得します。一般に、JNI側をより簡単に書くために、Java側でできる限り多くのことを行う方が効果的です。私はそれがネイティブメソッドの実装の作業を最小限に抑えることがどのようにあなたが見ることができると確信してい

public class SetConfig extends Config { 
    int status; 

    public int setConfig_IOCTL() { 
     return setConfig_IOCTL(user[number].a, user[number].b, user[number].c, 
       user[number].d); 
    } 

    private native int setConfig_IOCTL(int a, int b, int c, int d); 
} 

を、との数を最小限に抑える:たとえば、(たかったセマンティクスについて少し推測)この代わりに何かをするかもしれませんJNI関数は、呼び出す必要があります(おそらくゼロまで)。もちろん、対応するネイティブ実装は、現在のものとは異なる署名を持つことになります。

+0

返信いただきありがとうございます。私が持っているコードは、私が実装したものではなく、サンプルコードです。私はあなたの提案を感謝します。 – Spoons

関連する問題