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で動作しないのですか?
[JNIでjavaからCへの文字列配列を渡す]可能な複製(http://stackoverflow.com/questions/5972207/passing-string-array-from-java-to-c-with-jni) –
@ DougStevensonそれはStringArrayを渡す方法ではなく、StringArrayを含む構造体を渡す方法ではなく、良いdupeターゲットではないために、どのようにStringArrayを渡すかの解決策です。 –
Java構造体をC構造体に自動的にマッピングすることはできません。 JNIを使用して、渡されたjobjectオブジェクトから関心のあるメンバーをプログラマチックにプルする必要があります。文字列配列は処理するのに最も課税対象です。それは一種の痛みです。 –