Jna

编写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;

}

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容