首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java相关 >

jna中传递结构体数组有关问题

2012-01-26 
jna中传递结构体数组问题问题描述:在java程序中传递单个结构体时,程序正常; 但是传递的参数为结构体数组时

jna中传递结构体数组问题
问题描述:在java程序中传递单个结构体时,程序正常; 但是传递的参数为结构体数组时,程序出错。
提示: java.lang.IllegalArgumentException: Structure array elements must use contiguous memory (bad backing address at Structure array index 1)

具体代码如下:
dlljna2.h

C/C++ code
#define MYLIBAPI  extern   "C"     __declspec( dllexport ) #define CLIENT_INPUT_SIZE 4struct UserStruct{   long id;   wchar_t*  name;   int age;};MYLIBAPI void sayUser(UserStruct* pUserStruct);


dlljna2.cpp
C/C++ code
#include "stdafx.h"#include "dlljna2.h"#include "iostream"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;}


TestDll1Service.java
Java code
package test.cn;import test.cn.TestDll1Service.TestDll1.UserStruct;import com.sun.jna.Library;import com.sun.jna.NativeLong;import com.sun.jna.Structure;import com.sun.jna.Native;import com.sun.jna.WString;public class TestDll1Service {    public final static  int CLIENT_INPUT_SIZE = 4;    public interface TestDll1 extends Library {        TestDll1 INSTANCE = (TestDll1) Native.loadLibrary("dlljna2",                TestDll1.class);        public void say(WString value);        public static class UserStruct extends Structure {            public NativeLong id;            public WString name;            public int age;        }        public void sayUser(UserStruct struct);    }    public TestDll1Service() {    }    public static void main(String[] args) {        UserStruct userStruct = new UserStruct();        userStruct.id = new NativeLong(100);        userStruct.age = 30;        userStruct.name = new WString("沈东良");        TestDll1.INSTANCE.sayUser(userStruct);    }}


此时java程序运行正常


但是我稍作改动dlljna2.cpp文件改为
C/C++ code
#include "stdafx.h"#include "dlljna2.h"#include "iostream"void sayUser(UserStruct* pUserStruct){   std::wcout.imbue(std::locale("chs"));  for(int i = 0; i < CLIENT_INPUT_SIZE; i++)   {       std::wcout<<L"ID:"<<pUserStruct[i].id<<std::endl;   std::wcout<<L"姓名:"<<pUserStruct[i].name<<std::endl;    std::wcout<<L"年龄:"<<pUserStruct[i].age<<std::endl;}



然后将TestDll1Service.java代码改为
Java code
package test.cn;import test.cn.TestDll1Service.TestDll1.UserStruct;import com.sun.jna.Library;import com.sun.jna.NativeLong;import com.sun.jna.Structure;import com.sun.jna.Native;import com.sun.jna.WString;public class TestDll1Service {    public final static  int CLIENT_INPUT_SIZE = 4;    public interface TestDll1 extends Library {        TestDll1 INSTANCE = (TestDll1) Native.loadLibrary("dlljna2",                TestDll1.class);        public void say(WString value);        public static class UserStruct extends Structure {            public NativeLong id;            public WString name;            public int age;        }        public void sayUser(UserStruct[] struct);    }    public TestDll1Service() {    }    public static void main(String[] args) {        UserStruct[] userStructs = new UserStruct[CLIENT_INPUT_SIZE];                for(int i = 0; i < CLIENT_INPUT_SIZE; i++)        {            userStructs[i] =new UserStruct();            userStructs[i].id = new NativeLong(100);            userStructs[i].age = 30;            userStructs[i].name = new WString("沈东良");        }        TestDll1.INSTANCE.sayUser(userStructs);    }} 


就会报错:java.lang.IllegalArgumentException: Structure array elements must use contiguous memory (bad backing address at Structure array index 1)

请问如何解决这个问题?谢谢!


[解决办法]
像这种情况,可以考虑改一下接口,java端用字节数组发送,C端用字节数组接收,然后C再通过memcpy的方式,把字节数组内容复制到结构体中还原结构体。

热点排行