Jna

2018-12-20  本文已影响0人  潭潭_180

编写JNA封装c接口给JAVA调用最重要是参数传递,JNA只认纯c类型,对于c++的stl类型是不认识的,并且需要导出extern "c"函数。

流程:

1、c++导出extern “c" 的接口

extern "C"

    { 

 __declspec(dllexport) void fun1(Class* object);

   __declspec(dllexport) int fun2(char* buffer)

        {

        char * ctemp = "test";

        if(buffer) memcpy(buffer,ctemp,strlen(ctemp));

        return strlen(ctemp)

        }

    }

2、jna中声明一个interface继承Library:

importcom.sun.jna.Library;

importcom.sun.jna.Native;

importcom.sun.jna.Pointer;

public interface DLL extends Library{

//此处需要特别注意,在windows下最好用”\\" ,我在使用"/"出现加载失败的情况,不知道具体原因,试验多次后,改成"\\"即可。

    DLL  Instance=(DLL )Native.loadLibrary("d:\\test\\api.dll",DLL .class);

    String func1(Pointer object) ;

//从c++中返回string,此处需要这样定义,在下面详细述说该种用法

    int func2(Pointer buffer ) ;

//如果是java传递字符串给c++,直接String就可以

}

3、使用

public class Class1{

private final DLL  dll;

private Pointer self;

public Class1(){

this.dll = DLL.instance;

this.self = Pointer.NULL;

}

String fun2(){

Pointer buffer = Pointer.NULL;

int len = this.dll.func2(buffer);

buffer = new Memory(len);

//len = this.dll.func2(buffer);

byte[] byteArray = buffer.getByteArray(0,len);

String str = new String(byteArray );

return str;

}

}

上一篇 下一篇

猜你喜欢

热点阅读