C代码
extern "C" int _declspec(dllexport) getXMLResult(char *result)
{
result = "abcd";
return 20;
}
这个函数的目的是传入字符指针,在函数内容修改指针指向的字符串内容java代码
public class JNATest {

// This is the standard, stable way of mapping, which supports extensive
    // customization and mapping of Java to native types.
    public interface CLibrary extends Library {
        CLibrary INSTANCE = (CLibrary)
            Native.loadLibrary("TestDLL.dll", CLibrary.class);
    
        int getXMLResult(byte[] result);
    } /**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("begin");
//WString s = new WString("Hello, World");
//System.out.println("s="+s.toString());
byte[] c = {'a','a','a','a'};
System.out.println("c="+Native.toString(c));
//ByteByReference[] iref = new ByteByReference[4];
int i = CLibrary.INSTANCE.getXMLResult(c);
System.out.println("i="+i);
System.out.println("c="+Native.toString(c));
//System.out.println("s="+s.toString());
System.out.println("end");
}}
Java中byte[] c初始化,调用DLL中函数,但byte[] c的值没有被修改。
使用Java中用String也不行,指针一时也没搞懂怎么用。现在时间很急,有有经验的人帮忙指点下吗?
万分感谢。

解决方案 »

  1.   

    jna 传过去的 *result 只是原来的一个副本。
    你要传 MemoryPointer
      

  2.   

    非常感谢您的回复。
    能有个代码片段的例子吗,或者把思路、流程说的更详细些吗?我好参考下。
    现在非常急,本来用JNative,遇到java和c的类型转换问题,刚开始用JNA,不熟悉。
      

  3.   

    现在知道用Memory来处理指针的问题,调用C的函数声明修改如下:
    int getXMLResult(Memory result);但不知道在实际调用时如何处理Memory对象。
    问题1:Memory对象初始化时需要指定内存大小,这个大小如何计算?
    Memory m = new Memory(???);//如何计算
    问题2:如何给这个Memory指向的内容赋值,因为我要先打印调用C前的内容,再打印调用后修改的内容,以便验证是否正常工作。
    问题3:如何取回调用C后的内存里的字符串?哪位有经验的麻烦再指点下,多谢。
      

  4.   


    void getXMLResult(char *result) {
        memcpy(result, "abcde", 5);
    }
        private static native void getXMLResult(Memory m);    public static void main(String[] args) throws Exception {
            byte[] arr = "aaaaa\0".getBytes("ascii");
            Memory m = new Memory(arr.length);
            m.write(0, arr, 0, arr.length);
            System.out.println(m.getString(0, false));
            getXMLResult(m);
            System.out.println(m.getString(0, false));
        }
      

  5.   

    toni_wangjun
    你的问题解决了吗、
    我也有遇到同样的情况。你用abc130314的代码解决了吗?我按照他的写还是没有用。