java - 如何调用 JNA 到 VB.net ByRef 字符串函数

标签 java vb.net jna

我想从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;
}

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

关于java - 如何调用 JNA 到 VB.net ByRef 字符串函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41830352/

相关文章:

java - 在字节之间的套接字之间发送字符串

vb.net - 在 vb.net 的 datagridviewimagecolumn 中显示图像

javascript - 在 end_request 处理程序期间回发后无法从 asp gridview 检索数据

java - JNA Windows获取进程路径

java - 使用 JNA 查询所有 Windows 服务

java - JNA 将 Java boolean 值映射到 -1 整数?

java - 使用 spring DataAccessExceptions 代替 JPA PersistenceExceptions 有什么优势吗?

java - 为 Arrays/ArrayList 实现 Getter 和 Setter 方法的正确方法

java - Collections.sort 不适用于 Java 1.7

c# - 将文本附加到富文本框的最快方法?