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;
}
}