原文 http://blog.csdn.net/shendl/archive/2008/12/26/3599854.aspx
贴上
JNA—JNI
终结者
、
深入解析
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
font-size: 10pt; color: black; font-family:
分享到:
相关推荐
在《JNA—JNI终结者》一文中介绍了Java Native Access (JNA) 的基本使用方法及其优势,但当时并未深入探讨如何在Java中模拟C语言中的结构体(structure)。结构体在C语言中是一种非常重要的数据类型,它允许程序员将...
本文将深入探讨JNA在处理复杂结构体传递,包括结构体数组和结构体指针方面的知识。 JNA是一种Java库,允许Java代码直接调用本机API,而无需编写JNI代码。相比于JNI,JNA的使用更为简单和直观,但可能在性能上稍逊...
在"JNA 转java接口以及指针结构体解析"这个主题中,我们将深入探讨如何使用JNA来处理C语言中的结构体和指针。 首先,理解JNA的基本工作原理至关重要。JNA通过定义一个`Interface`,该接口中的方法对应于要调用的...
JNA是一种纯Java库,允许Java代码直接调用本地库(如C库)的功能,而无需编写JNI(Java Native Interface)代码。它通过映射C函数和结构到Java类型来实现这一目标。 在C语言中,结构体是数据组织的一种方式,可以...
可实现将C语言中的结构体转换为JAVA类型的实体类。 目前支持基础数据类型int、long、foloat、double、const char *、bool的转换,也支持将数组装换为JAVA中的ArrayList。目前有个难点是将枚举类型直接转换为JAVA中的...
JNI(Java Native Interface)和JNA(Java Native Access)是Java平台中用于与本地代码交互的两种主要技术。它们允许Java应用程序调用C、C++等本地库,从而扩展Java的功能,解决性能瓶颈或利用已有的非Java库。本...
JNI(Java Native Interface)和JNA(Java Native Access)都是Java平台上的原生接口技术,允许Java代码与操作系统底层交互,调用本地库。它们在功能上类似,但实现方式不同,因此性能也有所差异。 ### JNI JNI是...
JNA(Java Native Access)是Java平台上的一个开源库,它允许Java代码直接调用操作系统原生函数,而无需编写JNI(Java Native Interface)代码。这个"jna-master测试代码源代码.zip"文件包含了基于JNA 5.6.0版本的...
C语言源代码主要定义了几个函数和结构体,包括: - `say`: 该函数用于输出传入的字符串。 - `sayUser`: 该函数用于输出`UserStruct`结构体中的信息。 - `sayCompany` 和 `sayCompany2`: 这两个函数分别用于输出`...
值得注意的是,虽然JNA提供了便利,但它在性能上可能比直接使用JNI调用动态链接库慢一些,因为JNA封装了调用原生代码的过程。然而,对于绝大多数项目而言,这种性能损失的影响不大,因为JNA大大提高了开发效率和易用...
Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的原生函数,而无需编写C语言的JNI(Java Native Interface)代码。JNA 4.1.0是该库的一个官方版本,提供了增强的功能和...
"jna" 指的是Java Native Access,而 "jna-example" 暗示了这个话题将涉及JNA的使用示例,这对于初学者或者需要深入理解JNA功能的人来说非常有价值。 **文件列表解析:** 压缩包中唯一的文件 `jna-3.0.9.jar` 应该...
Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的原生函数,而无需编写任何C/C++代码或使用JNI(Java Native Interface)。JNA通过提供一种映射机制,将Java方法与本地库...
Java JNA(Java Native Access)是一种在Java平台上与本地代码交互的库,允许开发者无需编写JNI(Java Native Interface)代码就能调用C、C++等本地库。本示例将详细解析如何使用JNA在Java中调用C语言库文件。 首先...
本篇文章将深入探讨如何使用JNA来调用DLL,并提供一个完整的实例。 首先,了解JNA的基本原理至关重要。JNA通过映射Java接口到原生函数来实现与本地代码的交互。这些接口定义了要调用的函数签名,JNA会自动处理参数...
Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的原生函数,而无需编写C语言的头文件或动态链接库。JNA通过一个映射机制,将Java方法与C/C++函数相对应,从而实现跨语言的...
### 深入浅出JNA — 快速调用原生函数 #### 为什么需要JNA? 在软件开发过程中,特别是在需要与操作系统底层交互或利用高性能计算资源时,经常需要用到原生函数(通常指C/C++语言编写的库)。Java作为一种高级语言...
Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的原生函数,而无需编写C/C++的桥接代码。JNA通过映射Java方法到本地函数,实现了Java与操作系统底层功能的交互,极大地...
Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的原生(native)函数,而无需编写JNI(Java Native Interface)代码。JNA通过映射C数据类型和函数调用来实现这一目标,极...