2010-11-14 62 views
0

我想訪問一個結構內的結構數組。這是相關的C代碼減少的問題:JNA:如何在struct中訪問struct數組?

typedef struct { 
    int a; 
    int b; 
} fileinfo_t; 

typedef struct { 
    fileinfo_t **file; 
    int max_files; 
} project_t; 

在C語言中訪問數組是那麼容易,因爲這樣的:

int var_a_of_file_0 = project.file[0].a; 
int var_b_of_file_1 = project.file[1].b; 

如何在Java中實現這一點?我在問這個問題,因爲我是JNA的新手。到目前爲止,我閱讀了JNA文檔並嘗試了每個與我的問題有關的例子,但沒有運氣......

我使用JNAerator來轉換頭文件。我不知道,如果結果是正確的:

package test; 
import com.ochafik.lang.jnaerator.runtime.LibraryExtractor; 
import com.ochafik.lang.jnaerator.runtime.MangledFunctionMapper; 
import com.ochafik.lang.jnaerator.runtime.Structure; 
import com.sun.jna.Library; 
import com.sun.jna.Native; 
import com.sun.jna.NativeLibrary; 
import com.sun.jna.ptr.PointerByReference; 
/** 
* JNA Wrapper for library <b>test</b><br> 
* This file was autogenerated by <a href="http://jnaerator.googlecode.com/">JNAerator</a>,<br> 
* a tool written by <a href="http://ochafik.free.fr/">Olivier Chafik</a> that <a href="http://code.google.com/p/jnaerator/wiki/CreditsAndLicense">uses a few opensource projects.</a>.<br> 
* For help, please visit <a href="http://nativelibs4java.googlecode.com/">NativeLibs4Java</a> , <a href="http://rococoa.dev.java.net/">Rococoa</a>, or <a href="http://jna.dev.java.net/">JNA</a>. 
*/ 
public interface TestLibrary extends Library { 
    public static final java.lang.String JNA_LIBRARY_NAME = LibraryExtractor.getLibraryPath("test", true, test.TestLibrary.class); 
    public static final NativeLibrary JNA_NATIVE_LIB = NativeLibrary.getInstance(test.TestLibrary.JNA_LIBRARY_NAME, com.ochafik.lang.jnaerator.runtime.MangledFunctionMapper.DEFAULT_OPTIONS); 
    public static final TestLibrary INSTANCE = (TestLibrary)Native.loadLibrary(test.TestLibrary.JNA_LIBRARY_NAME, test.TestLibrary.class, com.ochafik.lang.jnaerator.runtime.MangledFunctionMapper.DEFAULT_OPTIONS); 
    public static class fileinfo_t extends Structure<fileinfo_t, fileinfo_t.ByValue, fileinfo_t.ByReference > { 
     public int a; 
     public int b; 
     public fileinfo_t() { 
      super(); 
     } 
     public fileinfo_t(int a, int b) { 
      super(); 
      this.a = a; 
      this.b = b; 
     } 
     protected ByReference newByReference() { return new ByReference(); } 
     protected ByValue newByValue() { return new ByValue(); } 
     protected fileinfo_t newInstance() { return new fileinfo_t(); } 
     public static fileinfo_t[] newArray(int arrayLength) { 
      return Structure.newArray(fileinfo_t.class, arrayLength); 
     } 
     public static class ByReference extends fileinfo_t implements Structure.ByReference { 

     }; 
     public static class ByValue extends fileinfo_t implements Structure.ByValue { 

     }; 
    }; 
    public static class project_t extends Structure<project_t, project_t.ByValue, project_t.ByReference > { 
     /// C type : fileinfo_t** 
     public PointerByReference file; 
     public int max_files; 
     public project_t() { 
      super(); 
     } 
     /// @param file C type : fileinfo_t** 
     public project_t(PointerByReference file, int max_files) { 
      super(); 
      this.file = file; 
      this.max_files = max_files; 
     } 
     protected ByReference newByReference() { return new ByReference(); } 
     protected ByValue newByValue() { return new ByValue(); } 
     protected project_t newInstance() { return new project_t(); } 
     public static project_t[] newArray(int arrayLength) { 
      return Structure.newArray(project_t.class, arrayLength); 
     } 
     public static class ByReference extends project_t implements Structure.ByReference { 

     }; 
     public static class ByValue extends project_t implements Structure.ByValue { 

     }; 
    }; 
} 

任何幫助,將不勝感激。

回答

0

由於結構數組不覆蓋包含結構的內存,所以您需要一個指針或該字段的等效類型。然後您可以從基指針手動派生出您需要的結構。

但是,我不認爲您的使用示例是有效的。

一旦你與「[0]」,你有一個指針fileinfo_t的,所以你就必須使用以下指數(你實際上是用C編寫的例子嗎?):

int var_a_of_file_0 = project.file[0]->a; 
int var_b_of_file_1 = project.file[1]->b; 

最終如何你提取實際結構取決於它們如何在內存中佈局,這在你當前的解釋中是不明確的。