2010-11-14 6 views
0

J'essaye d'accéder à un tableau de struct dans une structure. Ceci est le code correspondant C réduit au problème:JNA: Comment accéder au tableau de struct dans struct?

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

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

En C accéder au tableau est aussi facile que cela:

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

Comment puis-je mettre cela en Java? Je pose cette question parce que je suis nouveau à la JNA. Jusqu'à présent, j'ai lu la documentation JNA et essayé chaque exemple qui est en quelque sorte lié à mon problème, mais sans la chance ...

J'ai utilisé JNAerator pour convertir le fichier d'en-tête. Je ne sais pas pour shure si le résultat est correct:

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 { 

     }; 
    }; 
} 

Toute aide serait appréciée.

Répondre

0

Étant donné que le tableau de structures ne recouvre pas la mémoire de la structure contenant, vous avez besoin d'un pointeur ou d'un type équivalent pour ce champ. Vous pouvez ensuite dériver manuellement la structure dont vous avez besoin à partir du pointeur de base.

Je ne pense pas que votre exemple d'utilisation soit valide, cependant.

Une fois que vous indexez avec « [0] », vous avez un pointeur vers fileinfo_t, vous devez utiliser les éléments suivants (avez-vous réellement compilé votre exemple en C?):

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

En fin de compte comment vous extrayez les structures réelles dépend de leur disposition dans la mémoire, ce qui est ambigu dans votre explication actuelle.