JNI不支持的参数类型java.lang.StringBuilder

时间:2014-12-15 13:27:53

标签: java c++ vb.net

我是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 []。我得到了无效的内存访问异常。 请帮忙!! 提前谢谢!

2 个答案:

答案 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..."