2017-01-24 21 views
1

Я хочу вызвать функцию vB.net ByRef и String из java.Как вызвать JNA на VB.net ByRef String Function

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 []' не 'String', является то, что опечатка? –

+0

Вы также можете попробовать 'cdecl' в качестве вызывающего соглашения, afaik JNA предполагает стандарт C, который будет использовать cdecl. –

+0

use String не может обновить String args ... –

ответ

0

Я решил это с помощью 3F.

отображение джна

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

Java

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