我想从java调用vb.net ByRef和String函数。
vb.net dll 由 UnmanagementExports 制作。
//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;
}
关于java - 如何调用 JNA 到 VB.net ByRef 字符串函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41830352/