2 liruoxiu liruoxiu 于 2014.07.22 10:02 提问

最近用JNA技术,实现java调用C++的DLL,如何用java模拟c++的链表结构体。

C++结构体
struct CUser_DataStruct
{
char pKKSCoding[128]; //标签点Kks编码
DWORD time; //UTC时间
WORD millisecond; //毫秒
int nDataState; //数据状态
double dValue; //数值
CUser_DataStruct* pNext; //指向下一个数据节点的指针
};

C++的入口函数说明
Bool DataUp (CUser_DataStruct FPointArray[], int DataNumber,bool bCover);
参数:CUser_DataStruct FPointArray[]:输入参数,用户上传数据的结构体
int DataNumber:输入参数,数组的大小
bool bCover:输入参数,数据上传标识位,当为 true 时,表示上传数据可以覆盖
原有数据;当为 false 时,表示上传数据不可以覆盖原有数据
功能:数据上传接口
返回值:成功 true,失败 false

我的java模拟类
public class UserData extends Structure {

 public byte[] pKKSCoding =new byte[128];
 public int    nDataState;
 public Double DValue;
 public int   time;
 public short    millisecond;


 public UserData.ByReference PUserDataStruct;
 public static   class ByReference extends UserData implements Structure.ByReference{}
 public static   class ByValue extends UserData implements Structure.ByValue{}

 @Override
protected List getFieldOrder() {
    // TODO Auto-generated method stub
    return Arrays.asList(new String[]{"pKKSCoding","nDataState","DValue","time","millisecond","PUserDataStruct"});
}

代码实现部分
int nCount=2;
String TagName="NY001\0";
UserData.ByReference[] UserDataStruct= new UserData.ByReference[nCount];
for (int i=0;i<nCount;i++){

UserDataStruct[i]=new UserData.ByReference();
UserDataStruct[i].pKKSCoding=TagName.getBytes();
//取当前UTC
String lCurrentTime=String.valueOf(System.currentTimeMillis());

//截取到秒级
UserDataStruct[i].time=Integer.parseInt(lCurrentTime.substring(0, lCurrentTime.length()-3));
//截取后三位毫秒数
UserDataStruct[i].millisecond=Short.parseShort(lCurrentTime.substring(lCurrentTime.length()-3,lCurrentTime.length()));

UserDataStruct[i].nDataState=1;
UserDataStruct[i].DValue=(double) 456+i;
//链表指针
UserDataStruct[i].PUserDataStruct=new UserData.ByReference();
UserDataStruct[i].write();
}
result=Clientdll.Instanse.DataUp(UserDataStruct, nCount, true);

请各位大神帮忙指点指点

1个回答

zyq890817
zyq890817   2014.12.15 11:53
最近也遇到这些问题了,最后怎么解决的啊~~~
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
使用 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 sayUs
Java调用C语言动态库(JNA方式):回调函数、结构体数组传参、结构体数组返回
一、开发环境 系统、开发环境:win7、eclipse 32位、jdk 32位、jre 32位 由于这里使用的dll文件是32位的,而我本身的环境是64位的,包括eclipse、jdk、jre都是64位,所以这里需要开发环境共存(32位、64位共存),如果本来就是32为环境就不用从新搭建环境了。从以下连接分别下载32位软件: 1.eclipse,不用安装,解压后即可使用,解压目录:D
JNA调用C语言动态链接库学习实践总结(指针模拟)
最新因为项目需要,学习了一下JNA框架,在这里记录一下学习和使用心得,给大家分享,希望能帮助新手。 本文主要讲解如何使用JNA框架轻松调用C语言动态链接库,如何使用JNA模拟C语言参数(例如数组、指针等)。 JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架。 JNA官网地址:https://github.
jna调用c 的dll(包含回调函数)
创建dll .h #ifndef __MAIN_H__ #define __MAIN_H__ #include /* To use this exported function of dll, include this header * in your project. */ #ifdef BUILD_DLL #define DLL_EXPORT __declspec(
jna对结构体、指针、引用、拷贝参数传递的使用
虽然之前也用过jna,但是对于结构体的传递、指针参数数与返回值、引用参数与返回值、拷贝变量传递使用没有总结。 先上生成DLL代码: //dllTest.h#ifndef DLLTEST_H #define DLLTEST_H struct myStruct { int a; int b; }; extern "C"{ __declspec(dllexport) int addNor
深入解析JNA—模拟C语言结构体
 深入解析JNA—模拟C语言结构体   前言前几天写《JNA--JNI终结者》一文介绍JNA框架。写完之后才发现,忘了写比较有难度的C语言Struct的模拟了。今天就补上这篇文章,介绍Struct。不写怎样模拟C语言结构体,就不能算是真正解决了调用动态链接库的问题。C语言的结构体用得实在是太广泛了。  首先说明一点,本文中大量把模拟Struct的
java调用c dll,指针参数和结构体参数搞定
 终于有了比较大的成果,不过身体也累完了,昨天又去打的吊瓶,坐成铁的时候差点就晕倒在里面了,不知道什么原因,抵抗力这么差,明天放假,要在家好好休息,今天早上碰到欢欢了,她说给我做好吃的,我愿意吃她做的糖醋排骨,呵呵,还是把我的研究成果纪录下来吧!基于上两篇java调用dll的文章,我做了更为复杂的参数传递,指针变量和结构体变量,下面给出源码vc++中的工程名称是SMSXIAOSource 
Java调用C语言Dll库回调函数
import com.sun.jna.Native; import com.sun.jna.win32.StdCallLibrary; public class SaDllCallbackFunctionTest { DllLib1 cf = null; public boolean init() { try { cf = (DllLib1) Native.loadLibr
JNA—模拟C语言结构体
       前言 前几天写《JNA--JNI终结者》一文介绍JNA框架。写完之后才发现,忘了写比较有难度的C语言Struct的模拟了。 今天就补上这篇文章,介绍Struct。 不写怎样模拟C语言结构体,就不能算是真正解决了调用动态链接库的问题。 C语言的结构体用得实在是太广泛了。     首先说明一点,本文中大量把模拟Struct的类写作为接口的内部类。 这不是JNA
Java 调用 C/C++ 之 JNA 系列实战篇 —— 起步 (一)
一、 为什么写这个文章