2017-01-24 11 views
1

Javaからvb.net ByRefとString関数を呼び出したいと思います。JNDをVB.netに呼び出す方法ByRef文字列関数

vb.net dllは、UnmanagedExportsによって作成されています。

//java 
String[] str = {"testJavaWrited"}; 
String[] str2 = {"testJavaWrited2"}; 
final VbWrapper wr = (VbWrapper)Native.loadLibrary("vbtestlib", VbWrapper.class); 
wr.test(str,str2); 
System.out.println(str); // not printed 
System.out.println(str2); // not printed 

// jna mapping 
public interface VbWrapper extends Library { 
    public int test(String[] str,String[] str2); 
} 

//vb.net 
<DllExport("test", CallingConvention.StdCall)> 
Function test(ByRef str As String, ByRef str2 As String) As Integer 
    MsgBox("test Called") ' printed 
    MsgBox(str) ' printed 
    str = "testStringWrited" 
    str2 = "testStringWrited2" 
    Return 0 
End Function ' heap error 

私はあなたの助けが必要です。

+0

'文字列[]' 'STRING'ないことですタイプミス? –

+0

呼び出し規約として 'cdecl'を試すこともできます。afaik JNAはcdeclを使う標準Cを想定しています。 –

+0

Stringを使用すると文字列引数を更新できません... –

答えて

0

3Fの助けを借りて解決しました。

JNAマッピング

public interface CAPI extends Library 
{ 
    public int getStringArgs(LongByReference ptr); // see also Pointer etc. 
} 

ジャワ

CAPI l = Native.loadLibrary("DllExportAndJNA", CAPI.class); 
... 
LongByReference ptr = new LongByReference(); 
l.getStringArgs(ptr); 
(new Pointer(ptr.getValue())).getString(0); // Hello from .NET 

vb.netコード

[DllExport] 
public static int getStringArgs(ref IntPtr ptr) 
{ 
    ptr = Marshal.StringToCoTaskMemAnsi("Hello from .NET") 
    return 0; 
} 

[DllExport] 
public static void freeString(ref IntPtr ptr) 
{ 
    Marshal.ZeroFreeCoTaskMemAnsi(ptr) 
    return; 
} 

https://github.com/3F/DllExport/issues/25

関連する問題