2012-03-09 12 views

risposta

23

Esistono molti modi validi per richiamare in Java da C/C++. Ti mostrerò una tecnica usando C (facile da regolare env per C++) che rende abbastanza facile passare i dati dal codice nativo al codice Java. Questo esempio passa stringhe (facili da modificare per qualsiasi tipo di dati).

Nel codice nativo, creare la seguente:

// Globals 
static jmethodID midStr; 
static char * sigStr = "(Ljava/lang/String;ILjava/lang/String;)V"; 

// Init - One time to initialize the method id, (use an init() function) 
midStr = (*env)->GetMethodID(env, class, "javaDefineString", sigStr); 

// Methods 
static void javaDefineString(JNIEnv * env, jobject o, char * name, jint index, char * value) { 
    jstring string = (*env)->NewStringUTF(env, name); 
    (*env)->CallVoidMethod(env, o, midStr, string, index, (*env)->NewStringUTF(env, value)); 
} 

Nel codice Java creare la seguente:

Map<String, String> strings = new HashMap<String, String>(); 

// Never call this from Java 
void javaDefineString(String name, int index, String value) { 
    String key = name + "." + index; 
    strings.put(key, value); 
} 

utilizzo nativo per inviare i dati:

javaDefineString(env, o, "Greet", 0, "Hello from native code"); 
javaDefineString(env, o, "KeyTimeout", 0, "one second"); 
javaDefineString(env, o, "KeyTimeout", 1, "two second"); 

utilizzo di Java per ricevere dati:

System.out.println(strings.get("Greet.0"); 
System.out.println(strings.get("KeyTimeout.0"); 
System.out.println(strings.get("KeyTimeout.1"); 
+0

Ciao provato ma questo dice ... "errore: 'javaDefineString' non è stato dichiarato in questo ambito". Dato che non è un metodo JNI, come posso avere una dichiarazione nel file di intestazione .h. Qualche suggerimento? – CoDe

+0

@Shubh Apri una nuova domanda e aggiungi il tuo codice e le informazioni di errore. Chuck – Java42

+1

Per chi si chiede, 'class' può essere ottenuto con:' class = (* env) -> GetObjectClass (env, o); ' – Diego