2013-01-13 45 views
4

我正在使用JNA来访问DLL库(C++)方法。JNA如何将结构从Java传递给C++方法?

方法我想访问具有以下特征:int DownloadData(DateTime dateTime);

Return Values 
    COM_ERROR if an error occurs. 
    0 if no new records to download. 
    # of records transferred, if successful. 

,日期时间是一个结构(C++代码):

struct DateTime 
{ 
    int minute; 
    int hour; 
    int day; 
    int month; 
    int year; 
}; 

我在后续的方式做:

import com.sun.jna.FunctionMapper; 
import com.sun.jna.Library; 
import com.sun.jna.Native; 
import com.sun.jna.NativeLibrary; 
import com.sun.jna.Structure; 
import java.lang.reflect.Method; 
import java.util.HashMap; 
import java.util.Map; 

class JavaApplication1 
{ 
    public static class DateTime extends Structure { 
     public int minute; 
     public int hour; 
     public int day; 
     public int month; 
     public int year; 
    } 

...

 public interface CLibrary extends Library 
    { 
     CLibrary INSTANCE = (CLibrary) Native.loadLibrary("LibPro", CLibrary.class, options); 
     int DownloadData(DateTime dateTime); 
    } 

...

 public static void main(String[] args) 
    { 
     DateTime dateTime = new DateTime(); 
      dateTime.day=1; 
      dateTime.hour=0; 
      dateTime.minute=0; 
      dateTime.month=1; 
      dateTime.year=2012; 
     System.out.println("Record count : "+CLibrary.INSTANCE.DownloadData(dateTime)); 
    } 
} 

但我的代码不会返回多少记录被转移,但它返回-32704。图书馆通常会返回这样的值,然后出错。

我是对做在JNA方面?我还能尝试什么?

感谢您的帮助!

UPD。如果我发送空值CLibrary.INSTANCE.DownloadData(null)我有相同的结果

+0

“我的代码不会返回它应该的数据。” < - 那么它返回什么? – fge

+0

感谢您的回复,修正了 – Darkwing

+1

那里应该有多少回复?我怀疑排序问题... – fge

回答

2

如果您的本地方法期望结构按值传递,则需要声明并传递一个实现Structure.ByValue的参数。

public class DateTime extends Structure { 
    public class ByValue extends DateTime implements Structure.ByValue { } 
} 

那么你的映射声明是这样的:

通常需要按如下定义一个额外的类

int DownloadData(DateTime.ByValue dateTime); 
+0

很高兴知道,谢谢你的回答 –