b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

c++ java 使用JNA,让java调用原生代码(2)

电脑杂谈  发布时间:2018-02-16 23:04:34  来源:网络整理

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

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 燕昭公
      燕昭公

      他马云高互联网也可能的确不需要行贿

    热点图片
    拼命载入中...