`

使用 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);

    }

}


 

 
分享到:
评论

相关推荐

    C++头文件转JAVA JNA接口类

    3. **运行SWIG**:使用SWIG工具,结合SWIG接口文件和C++头文件,生成Java源代码。在命令行中,你可以运行类似这样的命令: ``` swig -java -c++ mycppheader.i ``` 这将会生成两个文件:`mycppheader_wrap.cxx`...

    JNA实例 JNA实例 JNA实例

    Java源代码部分主要展示了如何使用JNA调用上面定义的C语言函数。关键点如下: 1. **引入依赖库**: ```java import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.NativeLong; import ...

    利用jna在java下调用c语言库文件

    本示例将详细解析如何使用JNA在Java中调用C语言库文件。 首先,我们需要理解JNA的工作原理。JNA通过映射Java方法到本地函数来实现调用,这得益于其内建的类型映射系统。Java中的数据类型会自动转换为对应的C语言...

    JNA 4.1.0 官方版

    解压这个文件后,用户可以查看JNA的源代码,了解其内部实现机制,进行定制化开发或者为项目贡献代码。源码可能包括JNA库本身、示例、文档以及其他辅助工具。通过研究源码,开发者可以更好地理解JNA如何处理内存管理...

    jna3.2.1.rar

    JNA 3.2.1版本的源代码包含了解析、映射和调用本地函数的详细实现,这对于深入理解JNA的工作原理以及扩展其功能非常有帮助。通过阅读源代码,开发者可以学习如何创建自定义类型映射、优化性能,以及解决特定平台上的...

    Jna简单使用

    对于复杂的结构体或联合体,可以使用JNA提供的`Structure`和`Union`类来定义。 #### 知识点五:错误处理 1. **异常捕获**:在调用JNA方法时,可能会抛出`LastErrorException`,用于指示调用失败。 ```java try {...

    虹软2.0人脸识别JNA封装

    1. **源代码**:Java源代码文件,包含JNA接口定义以及可能的辅助类,用于与虹软的C/C++库进行交互。 2. **库文件**:可能有动态链接库(如.dll或.so)或静态库(如.lib或.a),这是虹软人脸识别算法的核心实现。 3. ...

    JNA调用DLL简单示例

    Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的本地库(如DLL在Windows系统中),而无需编写C语言的中间接口或使用复杂如Java Native Interface (JNI)的方法。JNA通过...

    JNADemo-master.zip

    Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的原生函数,而无需编写C语言的头文件或使用Java的JNI(Java Native Interface)。JNA通过一种映射机制将Java方法与本地库...

    Java调用本地库 JNAerator.7z

    使用JNAerator,你需要先准备好本地库的头文件,然后通过命令行或者集成开发环境(IDE)插件运行JNAerator,它会生成一个Java源代码文件,包含所有可调用的函数和结构体定义。 JNAerator的使用步骤大致如下: 1. ...

    CobaJNA:尝试 JNA

    `CobaJNA-master`很可能是这个项目的源代码仓库,其中包含了使用JNA调用特定本地库的示例。项目可能包括以下部分: - 主要的Java类,定义了JNA接口和调用原生函数的方法。 - 本地库的配置和加载逻辑。 - 示例的使用...

    Linux下跨语言调用C++实践.docx

    有几种常见的方法可以实现这一点,比如直接编译C++和C封装层的源代码生成动态库。这种方法虽然简单,但需要业务方获取并编译C++源代码,增加了部署的复杂度。 ##### 3.3 业务使用 业务方可以使用生成的动态库,...

Global site tag (gtag.js) - Google Analytics