2012-04-03 11 views
1

Ich bin mit JNI von vielen Variablen von Java nach C vorbeiJNI mehrere Variablen

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

Wie kann ich diese Variablen in C verwenden? Ich habe die Header-Datei erzeugt und i erhalten:

#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 

Wie die Variablen in meinem C-Code übergeben benutzen?

+1

[Was Sie versucht haben?] (Http://mattgemmell.com/2008/12/08/what-have-you-tried/) –

+0

Ihre Java-Methode und JNI Methodensignaturen nicht übereinstimmen. (int [] und jfloatArray). Verwenden Sie Java, um die Signatur zu generieren. Es spart viel Schmerz. – jogabonito

Antwort

0
  • Schreiben Sie eine .c-Datei, die übereinstimmt - gleicher Header, aber mit einem Body {} und Parameternamen.
  • etwas tun mit den Variablen
  • Rückkehr das Ergebnis

Code:

#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; 
} 

es Kompilieren mit etwas wie folgt aus:

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

kein einschließen Vergessen Zeile in Ihren Java-Code laden:

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

Führen Sie mit diesem, (unter der Annahme libfoo.so im aktuellen Verzeichnis).

java -Djava.library.path=. Foo