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); } }
相关推荐
3. **运行SWIG**:使用SWIG工具,结合SWIG接口文件和C++头文件,生成Java源代码。在命令行中,你可以运行类似这样的命令: ``` swig -java -c++ mycppheader.i ``` 这将会生成两个文件:`mycppheader_wrap.cxx`...
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的工作原理。JNA通过映射Java方法到本地函数来实现调用,这得益于其内建的类型映射系统。Java中的数据类型会自动转换为对应的C语言...
解压这个文件后,用户可以查看JNA的源代码,了解其内部实现机制,进行定制化开发或者为项目贡献代码。源码可能包括JNA库本身、示例、文档以及其他辅助工具。通过研究源码,开发者可以更好地理解JNA如何处理内存管理...
JNA 3.2.1版本的源代码包含了解析、映射和调用本地函数的详细实现,这对于深入理解JNA的工作原理以及扩展其功能非常有帮助。通过阅读源代码,开发者可以学习如何创建自定义类型映射、优化性能,以及解决特定平台上的...
对于复杂的结构体或联合体,可以使用JNA提供的`Structure`和`Union`类来定义。 #### 知识点五:错误处理 1. **异常捕获**:在调用JNA方法时,可能会抛出`LastErrorException`,用于指示调用失败。 ```java try {...
1. **源代码**:Java源代码文件,包含JNA接口定义以及可能的辅助类,用于与虹软的C/C++库进行交互。 2. **库文件**:可能有动态链接库(如.dll或.so)或静态库(如.lib或.a),这是虹软人脸识别算法的核心实现。 3. ...
Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的本地库(如DLL在Windows系统中),而无需编写C语言的中间接口或使用复杂如Java Native Interface (JNI)的方法。JNA通过...
Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的原生函数,而无需编写C语言的头文件或使用Java的JNI(Java Native Interface)。JNA通过一种映射机制将Java方法与本地库...
使用JNAerator,你需要先准备好本地库的头文件,然后通过命令行或者集成开发环境(IDE)插件运行JNAerator,它会生成一个Java源代码文件,包含所有可调用的函数和结构体定义。 JNAerator的使用步骤大致如下: 1. ...
`CobaJNA-master`很可能是这个项目的源代码仓库,其中包含了使用JNA调用特定本地库的示例。项目可能包括以下部分: - 主要的Java类,定义了JNA接口和调用原生函数的方法。 - 本地库的配置和加载逻辑。 - 示例的使用...
有几种常见的方法可以实现这一点,比如直接编译C++和C封装层的源代码生成动态库。这种方法虽然简单,但需要业务方获取并编译C++源代码,增加了部署的复杂度。 ##### 3.3 业务使用 业务方可以使用生成的动态库,...