2016-07-25 37 views
1

我想通过JNA在C++ dll和我的java项目之间建立一个连接。 dll.h在这个gitHub中:dll.h如何在JNA中使用Java的这种方法?

EXTERN_C DLLEXPORT int STDCALL SolveBoard(
    struct deal dl, 
    int target, 
    int solutions, 
    int mode, 
    struct futureTricks * futp, 
    int threadIndex); 
struct deal 
{ 
    int trump; 
    int first; 
    int currentTrickSuit[3]; 
    int currentTrickRank[3]; 
    unsigned int remainCards[DDS_HANDS][DDS_SUITS]; 
}; 
struct futureTricks 
{ 
    int nodes; 
    int cards; 
    int suit[13]; 
    int rank[13]; 
    int equals[13]; 
    int score[13]; 
}; 

我新鲜JNA和C++,我试图代码的Java这样的:

public interface DllAl extends StdCallLibrary{ 
DllAl instanceDll = (DllAl)Native.loadLibrary("dds",DllAl.class); 
public int SolveBoard(deal deal,int target,int solutions,int mode, futureTricks fut,int threadIndex); 
public int PrintFut(char title[],futureTricks fut); 

public static class deal extends Structure{ 
     public int trump; 
     public int first; 
     public int currentTrickSuit[] = new int [3]; 
     public int currentTrickRank[] = new int [3]; 
     public int remainCards[][] = new int[4][4]; 
     public static class ByReference extends deal implements Structure.ByReference {} 
     public static class ByValue extends deal implements Structure.ByValue {} 
     @Override 
     protected List<String> getFieldOrder() { 
      return Arrays.asList(new String[]{"trump", "first", "currentTrickSuit", "currentTrickRank","remainCards"}); 
     } 

} 
public static class futureTricks extends Structure{ 
    public int nodes; 
    public int cards; 
    public int suit[] = new int [13]; 
    public int rank[] = new int [13]; 
    public int equals[] = new int[13]; 
    public int score[] = new int[13]; 
     public static class ByReference extends futureTricks implements Structure.ByReference {} 
     public static class ByValue extends futureTricks implements Structure.ByValue {} 
     @Override 
     protected List<String> getFieldOrder() { 
      return Arrays.asList(new String[]{"nodes", "cards", "suit", "rank","equals","score"}); 
     } 

} 

} 但是,它会返回错误:

Exception in thread "main" java.lang.NullPointerException 
at java.lang.reflect.Array.getLength(Native Method) 
at com.sun.jna.Native.getNativeSize(Native.java:1162) 
at com.sun.jna.Structure.getNativeAlignment(Structure.java:1360) 
at com.sun.jna.Structure.getNativeAlignment(Structure.java:1385) 
at com.sun.jna.Structure.deriveLayout(Structure.java:1221) 
at com.sun.jna.Structure.calculateSize(Structure.java:1053) 
at com.sun.jna.Structure.allocateMemory(Structure.java:380) 
at com.sun.jna.Structure.ensureAllocated(Structure.java:356) 
at com.sun.jna.Structure.ensureAllocated(Structure.java:346) 
at com.sun.jna.Structure.write(Structure.java:737) 
at com.sun.jna.Structure.autoWrite(Structure.java:2047) 
at com.sun.jna.Function.convertArgument(Function.java:512) 
at com.sun.jna.Function.invoke(Function.java:305) 
at com.sun.jna.Library$Handler.invoke(Library.java:236) 
at com.sun.proxy.$Proxy0.SolveBoard(Unknown Source) 
at DllAl.main(DllAl.java:98) 
+0

我不确定你想要做什么。 *“在C++ dll和我的java项目之间建立连接”*太抽象了。你想从哪里打电话什么方法?为什么不从一个加载库的Java类开始,并在其中使用1个函数? – user1803551

+0

对不起我的错。其实我只想在我的java项目中使用SolveBoards,但这并不容易 – CrabBeach

+0

请注意,这是'C',而不是'C++'。这是两个完全不同的东西。 – technomage

回答

1

JNA做不映射2D(或3D,4D等)阵列。如果您需要映射二维数组you should replace it with a 1D array,然后编写自己的代码进行翻译。

你需要改变这一行:

public int remainCards[][] = new int[4][4]; 

到:

public int remainCards[] = new int[16]; 

然后转换二维坐标(例如,手,套装)的方法添加到1D指数(例如, 4 *手+套装)。

+0

感谢您的回答,看起来我需要添加很多方法。也许我应该直接翻译C++到java – CrabBeach

+1

没有看到原始代码,我不能在那里提供任何建议。但是,在代码中的任何地方都可以重复使用2d到1d的转换方法并不难。 –

相关问题