SayCompany函数的功能是把Company结构体中的name打印出来,同一时候把里面全部UserStruct成员的name打印出来。
然后我们在cpp文件里实现
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
{
return TRUE;
}
然后编译生成dll文件,由于我定义的project名字叫做JNATest,所以生成的dll文件叫做JNATest.dll。
2. Java使用JNA调用dll
我们须要创建一个interface,这里我们取名TestDll1,然后extends Library。我们须要把UserStruct和CompanyStruct两个结构体映射到java中,代码例如以下:
public class UserStruct extends Structure {
public static class ByReference extends UserStruct implements Structure.ByReference{};
public static class ByValue extends UserStruct implements Structure.ByValue{}
public NativeLong id;
public WString name;
public int age;
}
当中ByReference指的是指针,ByValue指的是值,然后以下三个字段分别相应.h文件里UserStruct中的三个字段,当中顺序一定不能错。由于作为内存传给c函数调用,读取时依照c中结构体的顺序来读,所以顺序一定不能错。
同理CompanyStruct在java中的映射例如以下:
public class CompanyStruct extends Structure{
public static class ByReference extends CompanyStruct implements Structure.ByReference{};
public static class ByValue extends CompanyStruct implements Structure.ByValue{};
public NativeLong id;
public WString name;
//须要使用toArray。由于java中的内存空间是不连续的。所以使用JNA提供的toArray方法生成连续的内存空间
public UserStruct.ByReference[] users=(UserStruct.ByReference[]) new UserStruct.ByReference().toArray(100);
public int count;
}
这里面有个须要特别注意的地方。否则会NULL错误。就是public UserStruct.ByReference[] users=(UserStruct.ByReference[]) new UserStruct.ByReference().toArray(100);这句话,假设改为public UserStruct.ByReference[] users=new UserStruct.ByReference[100],之后调用就会报错。原因是java的内存空间通常是不连续的,而我们须要连续的内存空间,这里须要使用JNA提供的toArray函数生成数组。c++ java
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-81079-2.html
他马云高互联网也可能的确不需要行贿