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