2016-04-18 15 views
1

が含まれていません:JNA。 char *それは私がにextern Cメソッドを持つDLLを持っている結果

extern "C" { 
    int ADAPTERSHARED_EXPORT full_hash(unsigned char* data, 
    uint64_t size, 
    int algorithm, 
    char* result, 
    int *res_size 
    ); 
} 

Javaから呼び出し、このメソッド インタフェース

public interface CA extends Library { 
     CA INSTANCE = (CA) Native.loadLibrary(
       (Platform.isWindows() ? "HashAdapterC" : "libHAL"), CA.class); 
     int full_hash(byte[] data, long size, int algorithm, String result, IntByReference res_size); 
} 

とmainメソッド

public static void main(String[] args) { 
     logger.debug("being started"); 
     try { 
      CA lib = CA.INSTANCE; 
      String str = "1234567"; 
      String res = ""; 
      IntByReference in = new IntByReference(32); 
      byte[] data = str.getBytes(); 
      int i = lib.full_hash(data, str.length(), 3, res, in); 
      logger.debug("result = " + res); 
      logger.debug("error = " + i); 
      return; 
     } catch (Exception e) { 
      e.printStackTrace(); 
      logger.error("err"); 
      return; 
     } 
    } 

空の文字列の結果を呼び出した後C

unsigned char data[] = { 
      0xB1, 0x94, 0xBA, 0xC8, 0x0A, 0x08, 0xF5, 0x3B, 
      0x36, 0x6D, 0x00, 0x8E, 0x58 
     }; 
     uint64_t size = sizeof(data); 
    int res_size = 32; 
    char* result = (char*)malloc(res_size); 
    int is_success = hash(data, size, 3, result, &res_size); 
    if (is_success == 0) 
    { 
     printf("Success\n"); 
     int i; 
     for (i = 0; i < res_size; ++i) 
     { 
      printf("%X", (unsigned char)result[i]); 
     } 
     printf("\n"); 
    } 

からそれを呼び出す場合

は、私は結果の文字列を取得します。

is't char * - String?または私は別のタイプを使用しますか?

+0

を結果を宣言する必要がありました;' DLLにあなたの文字列を渡すには、データを文字の配列に結果を受けなければなりません。それを 'String'に変換します。 JavaのString型は、[tag:c]がstringのための規則として使用するように、ヌルターミネータを持つcharの単純な配列ではありません。 – LPs

+1

ありがとうLPsそれは本当に働いています) – 6azbljlb

答えて

1

)あなたが `str.getBytes(使用されるようにバイトとして[]

public interface CA extends Library { 
    CA INSTANCE = (CA) Native.loadLibrary(
      (Platform.isWindows() ? "HashAdapterC" : "libHAL"), CA.class); 
    int full_hash(byte[] data, long size, int algorithm, byte[] result, IntByReference res_size); 
} 
+0

結果は基本的にバッファである必要があります。 'char *'は 'const char *'と同じものではありません。 – technomage

関連する問題