• 使用 JNA 模拟C语言结构体的完整源代码


    C语言源代码:

    头文件

    #define MYLIBAPI  extern   "C"     __declspec( dllexport ) 
    
    MYLIBAPI void say(wchar_t* pValue);
    
     struct UserStruct{
       long id;
       wchar_t*  name;
       int age;
    };
    
    MYLIBAPI void sayUser(UserStruct* pUserStruct);
    
    struct CompanyStruct{
        long id;
       wchar_t*  name;
    //  UserStruct*  users[100];
       UserStruct   users[100];
       int count;
    };
    
    struct CompanyStruct2{
        long id;
       wchar_t*  name;
      UserStruct*  users[100];
      // UserStruct   users[100];
       int count;
    };
    
    MYLIBAPI void sayCompany(CompanyStruct* pCompanyStruct);
    
    MYLIBAPI void sayCompany2(CompanyStruct2* pCompanyStruct);

    源文件

    #include "stdafx.h"
    #include <locale.h>
    #include <iostream>
    #include "Out.h"
    
    void  say(wchar_t* pValue){
         std::wcout.imbue(std::locale("chs"));
         std::wcout<<L"上帝说:"<<pValue<<std::endl;
    }
    
    void sayUser(UserStruct* pUserStruct){
       std::wcout.imbue(std::locale("chs"));
       std::wcout<<L"ID:"<<pUserStruct->id<<std::endl;
       std::wcout<<L"姓名:"<<pUserStruct->name<<std::endl;
       std::wcout<<L"年龄:"<<pUserStruct->age<<std::endl;
    }
    
    void sayCompany(CompanyStruct* pCompanyStruct){
    	 std::wcout.imbue(std::locale("chs"));
    	 std::wcout<<L"ID:"<<pCompanyStruct->id<<std::endl;
    	 std::wcout<<L"公司名称:"<<pCompanyStruct->name<<std::endl;
    	 std::wcout<<L"员工总数:"<<pCompanyStruct->count<<std::endl;
         for(int i=0;i<pCompanyStruct->count;i++){
            sayUser(&pCompanyStruct->users[i]);
         }
    }
    
    void sayCompany2(CompanyStruct2* pCompanyStruct){
    	std::wcout.imbue(std::locale("chs"));
    	std::wcout<<L"ID:"<<pCompanyStruct->id<<std::endl;
    	std::wcout<<L"公司名称:"<<pCompanyStruct->name<<std::endl;
    	std::wcout<<L"员工总数:"<<pCompanyStruct->count<<std::endl;
         for(int i=0;i<pCompanyStruct->count;i++){
            sayUser(pCompanyStruct->users[i]);
         }
    }
    
     
    

    Java源文件:

    请先把JNA.jar导入classpath。

    package com.google.p.shendl.jna.net;
    import com.google.p.shendl.jna.net.TestDll1Service.TestDll1.CompanyStruct;
    import com.google.p.shendl.jna.net.TestDll1Service.TestDll1.CompanyStruct2;
    import com.google.p.shendl.jna.net.TestDll1Service.TestDll1.UserStruct;
    import com.sun.jna.Library;
    import com.sun.jna.Native;
    import com.sun.jna.NativeLong;
    import com.sun.jna.Structure;
    import com.sun.jna.WString;
    
    
    /**
     * @author 沈东良 Edward Shen shendl_s@hotmail.com
     * 2008-11-23 下午05:07:14
     * TestDll1.dll
     */
    
    public class TestDll1Service {
        public interface TestDll1 extends Library {
           /**
            * 当前路径是在项目下,而不是bin输出目录下。
            */
           TestDll1 INSTANCE = (TestDll1)Native.loadLibrary("TestDll1", TestDll1.class);
    
           public void say(WString value);
    
           /*
            * 定义一个类,模拟C语言的结构
            * */
    
           public static 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;
           }
    
           public void sayUser(UserStruct.ByReference struct);
    
           public static class CompanyStruct extends Structure{
                public static class ByReference extends CompanyStruct implements Structure.ByReference { }
               public NativeLong id;
               public WString  name;
               //public UserStruct[] users;
               public UserStruct.ByValue[] users;
               //public UserStruct.ByValue[] users=new UserStruct.ByValue[100];
               public int count;
    
           }
    
          public   void sayCompany(CompanyStruct.ByReference pCompanyStruct);
          public static class CompanyStruct2 extends Structure{
             public static class ByReference extends CompanyStruct2 implements Structure.ByReference { }
               public NativeLong id;
               public WString  name;
    
               public UserStruct.ByReference[] users=new UserStruct.ByReference[100];
               public int count;
    
           }
          public void sayCompany2(CompanyStruct2.ByReference  pCompanyStruct);
        }
        /**
         *
         */
        public TestDll1Service() {
    
           // TODO Auto-generated constructor stub
    
        }
    
        /**
         * @param args
         */
        public static void main(String[] args) {
           // TODO Auto-generated method stub
           TestDll1.INSTANCE.say(new WString("Hello World!"));
           System.out.println("HHEEH我我们无法万恶");
           UserStruct.ByReference userStruct=new UserStruct.ByReference();
           userStruct.id=new NativeLong(100);
           userStruct.age=30;
           userStruct.name=new WString("沈东良");
           TestDll1.INSTANCE.sayUser(userStruct);
           System.out.println("AAAAAAAAAAAAAAAAAAAAAAAAAAA");
           CompanyStruct.ByReference companyStruct=new CompanyStruct.ByReference();
           companyStruct.id=new NativeLong(1);
           companyStruct.name=new WString("Google");
           companyStruct.count=9;
            companyStruct.users=new UserStruct.ByValue[100];
           //companyStruct.users=(UserStruct[])new UserStruct().toArray(100);
           UserStruct.ByValue userStructValue=new UserStruct.ByValue();
           userStructValue.id=new NativeLong(100);
           userStructValue.age=30;
           userStructValue.name=new WString("沈东良");
           for(int i=0;i<companyStruct.count;i++){
               companyStruct.users[i]=userStructValue;
               //companyStruct.users[i].id=new NativeLong(companyStruct.users[i].id.intValue()+i);
           }
    
           TestDll1.INSTANCE.sayCompany(companyStruct);
           /*
           System.out.println("++++++++++++++");
           UserStruct.ByReference pUserStruct=new UserStruct.ByReference();
           pUserStruct.id=new NativeLong(90);
           pUserStruct.age=99;
           pUserStruct.name=new WString("良少");
           TestDll1.INSTANCE.sayUser(pUserStruct);
           System.out.println("---------------------");
           UserStruct.ByValue userStructValue=new UserStruct.ByValue();
           userStructValue.age=10;
           userStructValue.id=new NativeLong(1);
           userStructValue.name=new WString("良子");
           TestDll1.INSTANCE.sayUser(userStructValue);
           */
           System.out.println("BBBBBBBBBBBBBBBBBBBBBBBB");
    
           CompanyStruct2.ByReference companyStruct2=new CompanyStruct2.ByReference();
           companyStruct2.id=new NativeLong(2);
           companyStruct2.name=new WString("Yahoo");
           companyStruct2.count=10;
          
           UserStruct.ByReference pUserStruct=new UserStruct.ByReference();
           pUserStruct.id=new NativeLong(90);
           pUserStruct.age=99;
           pUserStruct.name=new WString("良少");
            pUserStruct.write();
    
        //  TestDll1.INSTANCE.sayUser(pUserStruct);
    
           for(int i=0;i<companyStruct2.count;i++){
               companyStruct2.users[i]=pUserStruct;
               //companyStruct.users[i].id=new NativeLong(companyStruct.users[i].id.intValue()+i);
           }
    
           TestDll1.INSTANCE.sayCompany2(companyStruct2);
    
        }
    
    }



  • 相关阅读:
    Cesium实现键盘控制镜头效果
    怎么判断一个服务器的服务器性能
    2T以上的盘怎么分区, 利用parted创建 linuxTB硬盘GPT分区
    解压和压缩的简单用法
    关于windows修改远程登录端口的问题
    tomcat启动非常慢;连接oracle数据库失败,jdbc错误日志提示connection reset;测试主机间网络互通及数据库端口都正常
    docker的安装和基础使用
    Centos7 时区的设置
    Day24 中间件 自定义分页 ModelForm 序列化 缓存 信号
    Day22 博客园的构建
  • 原文地址:https://www.cnblogs.com/leixiaohua1020/p/3902037.html
Copyright © 2020-2023  润新知