2016-04-15 31 views
3

com.sun.jna.Structurecom.sun.jna.StringArrayを含む例をJavaからネイティブCコードにJNAを使用して渡す方法の例、および構造体の内容をCコードで正常に取得することができません。JNAを使用してcom.sun.jna.StructureをC言語で構造体Cに渡す方法

Cコードの構造体をJavaの構造体に正常に渡すことができますが、構造体をJavaコードで作成して構造体としてCコードに正常に送信できません。

これは、問題のコードです:

String[] user_name_array = new String[3]; 
user_name_array[0] = "test_user_1"; 
user_name_array[1] = "test_user_2"; 
user_name_array[2] = "test_user_3"; 
StringList.ByReference members = new StringList.ByReference(); 
members.length = 3; 
members.strings = new StringArray(user_name_array); 
MyNativeLibrary.myMethod(members); 

は十分に単純なようだが、それは働いていません。

期待通りにCコードに正常に入りますが、構造体のポインタは空で長さはゼロです。ここで

は、JavaでSTRINGLIST構造である:ここで

public static class StringList extends Structure { 
    public volatile long length; 
    public volatile Pointer strings; 
    public static class ByValue extends StringList implements Structure.ByValue {} 
    public static class ByReference extends StringList implements Structure.ByReference { 
     public ByReference() { } 
     public ByReference(Pointer p) { super(p); read(); } 
    } 
    public StringList() { } 
    public StringList(Pointer p) { super(p); read(); } 
} 

はCのコードでは、対応する構造体です:

typedef struct string_list { 
    uint64_t length; 
    const char **strings; 
} string_list; 

そしてここでは、Cコード内のメソッドの定義です:

const char* my_method(struct string_list *members) 
{ 
    //................. 
} 

ndk-gdbを使用してこの関数に侵入すると、これがショー:

(gdb) break my_method 
(gdb) cont 
Continuing. 

Breakpoint 1, my_method (members=0x9bee77b0) at ../app/my_code_file.c:368 
(gdb) p *members 
$1 = {length = 0, strings = 0x0} 

それが動作するはずのように思えるので、なぜ値がCコードにそれを行っていませんか?私は何が欠けていますか?

のJava:

//This works! 
StringList members = MyNativeLib.myTestFunction(3, new StringArray(user_name_array)); 

C:

//This works! 
string_list* my_test_function(uint64_t length, const char **strings) 
{ 
    //...... 
} 

はまた、構造体の内部ではない場合、私は成功したJavaコードからCコードに直接のStringArrayを送ることができることに注意してください

この場合、JNAは期待どおりに動作するようです。だから、それはなぜ構造体as the documentation states it shouldで動作しないのですか?

+0

[JNIでjavaからCへの文字列配列を渡す]可能な複製(http://stackoverflow.com/questions/5972207/passing-string-array-from-java-to-c-with-jni) –

+2

@ DougStevensonそれはStringArrayを渡す方法ではなく、StringArrayを含む構造体を渡す方法ではなく、良いdupeターゲットではないために、どのようにStringArrayを渡すかの解決策です。 –

+1

Java構造体をC構造体に自動的にマッピングすることはできません。 JNIを使​​用して、渡されたjobjectオブジェクトから関心のあるメンバーをプログラマチックにプルする必要があります。文字列配列は処理するのに最も課税対象です。それは一種の痛みです。 –

答えて

3

フィールドをvolatileとしてマークしないでください。そうすると、明示的なStructure.writeField()を実行しない限り、JNAはそれらに書きません。

関連する問題