Ho un'applicazione Java che richiama il codice C++/C nativo. Il codice C++/C deve richiamare in Java. Potresti darmi qualche esempio su come farlo.JNI - Come richiamare da C++ o C a Java?
26
A
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");
Problemi correlati
- 1. JNI: passaggio di byte da C++ a java
- 2. Impossibile effettuare chiamate da C++ a Java utilizzando JNI
- 3. stringhe JNI e stringhe C
- 4. Impossibile eseguire la chiamata JNI da C++ a java in Android lollipop utilizzando jni
- 5. Restituzione di una classe C++ a Java tramite JNI
- 6. API di richiamo JNI - NoClassDefFoundError (C/Java)
- 7. chiama la funzione java da c utilizzando jni
- 8. JNI che chiama Java da C++ con più thread
- 9. Come chiamare C++ da Java?
- 10. Migrazione da Java a C#
- 11. Come trasferire una struttura C in java utilizzando JNI?
- 12. Invia JNI C stderr/stdout tramite log4j
- 13. Passaggio di stringhe a doppio byte (WCHAR) da C++ a Java tramite JNI
- 14. Come passare una bitmap da Java a C++ con JNI nello sviluppo Android?
- 15. migrazione a C# da Java
- 16. JNI come accedere a Java Object (Integer)
- 17. Invoke Java da C++
- 18. Come chiamare Java da C++ usando SWIG?
- 19. C/C++ header to java
- 20. Passare i puntatori tra C e Java attraverso JNI
- 21. È possibile chiamare il codice Java C++?
- 22. Utilizzo di Java da C++
- 23. Come restituire l'array int da Java a JNI
- 24. Come restituire un array da JNI a Java?
- 25. Sviluppo di applicazioni JNI con Eclipse (Java combinato/C++)
- 26. Java. JNI. jvm.dll
- 27. Chiama C++ puntatore a funzione da C#
- 28. Cosa succede se chiamo una funzione java da più thread da C con JNI?
- 29. forza Java per chiamare il mio distruttore C++ (JNI)
- 30. Chiama qualsiasi metodo Java da C#
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
@Shubh Apri una nuova domanda e aggiungi il tuo codice e le informazioni di errore. Chuck – Java42
Per chi si chiede, 'class' può essere ottenuto con:' class = (* env) -> GetObjectClass (env, o); ' – Diego