我是JNI的新手。我试图从我的Java应用程序调用扫描仪DLL。我有调用这个DLL的vb.net代码,它工作正常。当我从我的java代码调用此函数时,我收到此错误“不支持的参数类型java.lang.StringBuilder”。
vb.net
<DllImport("some32.DLL")> _
Public Shared Function myCFunction(ByVal param1 As StringBuilder, ByRef param2 As Integer, ByRef param3 As Integer) As Integer
End Function
在Java中,
StringBuilder sBuilder = new StringBuilder(255);
int p1 = 0 , p2 = 0;
ret = DCCAPI.myCFunction(sBuilder, p2, p1);
public int myCFunction(StringBuilder sBuilder,int p1, int p2);
我尝试将数据类型更改为char [],String,Byte []。我得到了无效的内存访问异常。 请帮忙!! 提前谢谢!
答案 0 :(得分:0)
最后我使用PointerByReference解决了这个问题。
PointerByReference pParam1 = new PointerByReference();
ret = DCCAPI.myCFunction( pParam1, p2, p1);
and then i retrieve the string ;
Pointer ptrParam1 = pParam1.getPointer();
String sTemp = ptrParam1.getString(0);
谢谢大家......
答案 1 :(得分:0)
您也可以传入一个char数组,然后将其转换回Java中的字符串。 E.g:
char[] buffer = new char[255];
ret = DCCAPI.myCFunction(buffer, p2, p1);
String someString = new String(buffer);
有一点需要注意的是,如果你没有从C函数中获取返回给你的字符串的长度,那么你可能需要修剪字符串末尾的空值。例如。你会回来"abcdef\0\0\0..."
。