簡體   English   中英

如何調用JNA到VB.net ByRef字符串函數

[英]How to Call JNA to VB.net ByRef String Function

我想從java調用vb.net ByRef和String函數。

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

我需要你的幫助。

我在3F的幫助下解決了這個問題。

jna映射

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM