2012-04-03 80 views
1

我使用JNI通過將許多變量從Java到CJNI多個變量

public native int[] intArrayMethod(int[] t,int nbr,int tag); 

我如何可以在C使用這些變量? 我已經生成的頭文件,我得到:

#ifndef _Included_MainClass 
#define _Included_MainClass 

#ifdef __cplusplus 
extern "C" 
{ 
#endif 

/* 
Class:  MainClass 
Method: intArrayMethod 
Signature: ([FII)[I 
*/ 

    JNIEXPORT jintArray JNICALL Java_MainClass_intArrayMethod 
     (JNIEnv *, jobject, jfloatArray, jint, jint); 

#ifdef __cplusplus 
} 
#endif 

#endif 

如何使用我的C代碼傳遞的變量?

+1

[你嘗試過什麼?](http://mattgemmell.com/2008/12/08/what-have-you-tried/) – 2012-04-03 11:39:14

+0

您的Java方法和JNI方法簽名不匹配。 (int []和jfloatArray)。使用javah生成簽名。它可以節省很多痛苦。 – jogabonito 2012-04-03 12:03:53

回答

0
  • 寫一個.c文件以匹配 - 相同的頭文件,但帶有body和參數名稱。
  • 做一些與變量
  • 返回結果

代碼:

#include "foo.h" 
JNIEXPORT jintArray JNICALL Java_MainClass_intArrayMethod 
(JNIEnv * env, jobject obj, jfloatArray arr, jint a, jint b) { 

    jintArray ret[2]; 
    ret[0] = a + b; 
    ret[1] = arr[0] + arr[1]; 
    return ret; 
} 

像這樣的東西編譯:

gcc -shared foo.c -I/path/to/java/include -o libfoo.so 

不要忘了包括在您的Java代碼中載入行:

static { 
    System.loadLibrary("foo"); // does not include lib prefix, or .dll/.so suffix! 
} 

用此運行,(假設在當前目錄中爲libfoo.so)。

java -Djava.library.path=. Foo