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);
}
}
分享到:
相关推荐
深入解析JNA—模拟C语言结构体
java通过jna调用c返回结构体例子,就是解决c语言返回结构体,java用类对象接收,包含jar包,java文件,c文件,操作步骤文档,在linux下完美通过
JNA 复杂结构体传递 结构体数组,结构体指针 查询很多资料才整合!
经过几天的奋战,终于让我搞懂了JNA的解析以及指针在结构体中的应用!!!下了很多的资料,里面包含c++的.h头文件,给需要帮助的人看看!! 里面包含代码以及解析过程。
jna调用C语言函数库dll、so jni介绍
详细演示了如何通过JNA实现以下形式的动态链接库接口: 1:基本数据类型 2:基本数据类型的指针和引用 3:结构体 4:结构体的指针和引用 5:函数指针和回调函数 6:字符串指针 7:输入一个数组 8:输出一个数组并...
是基于JNA5.6.0的下载于2020-11-10的测试代码,网上的教程过于初级,想要更深研究JNA还是看看作者写的测试用例与源代码比较靠谱
Java调用C语言动态库(JNA方式):回调函数、结构体数组传参、结构体数组返回-附件资源
源代码帮助理解。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。...
JNA远程方法调用中的本地Java项目,调用远程的C项目方法。
将多个变量放到一个结构体中,减少函数传递时的多个参数传进传出的复杂性 结构体传进函数时,是以引用的形式传入的,不是以指针的形式。
1、jna-3.3.0.jar.zip、jna-3.3.0-platform.jar.zip这两个包都是必须要安装的 2、JNA_javadoc.zip是我自己用jna-3.3.0.jar.zip里的源码导出的,可以放在Eclipse作为doc文档...3、jna-3.3.0.jar.zip里面含有jna的源代码
java后端springBoot框架使用jna调取C语言的dll接口(停车场道闸接口) 包含构造体的调用, 回调函数的调用,JNA和C / C ++的数据类型映射,Pointer类型的使用
该资源中,包含jna.jar 和一个jna的函数文档。...该例子是访问本地的IC卡读卡器,其中因为原始厂商提供的本地代码函数过于发杂,为了便于JNA调用,又对本地代码进行了封装。这是一个很好的JNA使用范例。
java使用jna开启关闭第三方应用程序,附简单的例子,打开一个记事本,朋友们也可以改为自己需要打开的应用程序
在此编了一个利用jna在java平台下调用c语言动态链接库的例子,c++代码也已经提供,java代码已经调试通过。
使用JNA加载C++的dll库实战 完整实例的代码 https://blog.csdn.net/huanzhongying/article/details/88706250
JNA示例的C++工程代码,包含了结构体指针、函数指针、def文件、dll编程等
java调用C++ jna 的jar包,使用JNA去调用C++的代码,比JNI更简单,更易用