En utilisant JNI pouvons-nous passer des types de données personnalisés de Java à C (ou vice versa)? Je vois un mappage de types de données primitifs à des types dans C, mais je ne sais pas trop si nous pouvons envoyer à travers nos propres types de données (par exemple, envoyer à travers ou retourner un objet employé ou quelque chose!).Passage de types de données de Java à C (ou vice versa) en utilisant JNI
Répondre
Si vous allez faire cela avec beaucoup d'objets, quelque chose comme Swig serait le meilleur. Vous pouvez utiliser le type jobject pour transmettre des objets personnalisés. La syntaxe n'est pas sympa, peut-être existe-t-il un meilleur moyen d'écrire ceci.
Exemple objet employé:
public class Employee {
private int age;
public Employee(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
Appelez ce code à partir de certains clients:
public class Client {
public Client() {
Employee emp = new Employee(32);
System.out.println("Pass employee to C and get age back: "+getAgeC(emp));
Employee emp2 = createWithAge(23);
System.out.println("Get employee object from C: "+emp2.getAge());
}
public native int getAgeC(Employee emp);
public native Employee createWithAge(int age);
}
Vous pourriez avoir des fonctions JNI comme celui-ci pour le passage d'un objet employé de Java à C, comme méthode de jobject argument:
JNIEXPORT jint JNICALL Java_Client_getAgeC(JNIEnv *env, jobject callingObject, jobject employeeObject) {
jclass employeeClass = (*env)->GetObjectClass(env, employeeObject);
jmethodID midGetAge = (*env)->GetMethodID(env, employeeClass, "getAge", "()I");
int age = (*env)->CallIntMethod(env, employeeObject, midGetAge);
return age;
}
Passage d'un objet salarié de C vers Java en tant que jobje ct, vous pouvez utiliser:
JNIEXPORT jobject JNICALL Java_Client_createWithAge(JNIEnv *env, jobject callingObject, jint age) {
jclass employeeClass = (*env)->FindClass(env,"LEmployee;");
jmethodID midConstructor = (*env)->GetMethodID(env, employeeClass, "<init>", "(I)V");
jobject employeeObject = (*env)->NewObject(env, employeeClass, midConstructor, age);
return employeeObject;
}
J'ai des problèmes avec "LEmployee;" partie j'ai essayé avec "com.pak1.Employee" et avec "Lcom.pak.Employee;" mais pas de résultat, des idées? – Lukap
@Lukap: si votre classe est com.pak.Employee alors la signature de la classe sera "Lcom/pak/Employee;" – nautilusvn
Avez-vous une idée de comment cela fonctionne pour 'String'? – mafioso
- 1. passage d'une structure de données de java à perl (et vice versa)
- 2. Passage de Integer à int et vice versa
- 3. Conversion d'un UNICODE_STRING en ANSI ou vice versa en C
- 4. Passage de CodeRush à ReSharper (ou vice-versa). Des ressources/de l'aide pour faire la transition?
- 5. Fusion de classe en chaîne et vice versa en Java
- 6. Sérialiser une structure en C# vers C++ et vice versa
- 7. Convertir un double à une chaîne en Java et vice-versa sans perdre la précision
- 8. Création de Java exécutable en utilisant JNI?
- 9. JNI Java en C++
- 10. Appel d'une méthode Excel Add-In à partir de l'application C# ou vice versa
- 11. JSON, JS vers Java et Vice Versa, et d'autres langues
- 12. Convertir les pixels en pouces et vice versa en C#
- 13. Décimal en binaire (et vice-versa)
- 14. Chaîne à octet [] et vice versa?
- 15. convertir l'image en matrice et vice versa?
- 16. Cast interface à son objet de mise en œuvre concrète ou vice versa?
- 17. Comment convertir un nombre décimal en temps ou vice versa
- 18. Transformer le type de données d'image OpenCV en format image Devil et vice-versa
- 19. Création d'une QMainWindow à partir de Java en utilisant JNI
- 20. Library pour la cartographie multi-plateforme de types MIME pour extensions de fichiers et vice versa
- 21. Le passage d'un octet [] en Java à une fonction C à JNI: comment utiliser jarraybyte
- 22. Conversion de l'audio en code et vice versa
- 23. Octet efficace [] pour BitmapImage et vice versa conversion en C#
- 24. jni et en utilisant C++ new'ed objets en java
- 25. Ouvrir CDialog à partir de Java en utilisant JNI
- 26. Conversion de la couleur hexadécimale en RVB et vice versa
- 27. Appel de fonctions Flash à partir de C# et vice versa
- 28. Conversion du pointeur de fonction de classe en void * ou vice versa
- 29. Importer des valeurs non signées de Jython, via Java, vers C et vice-versa
- 30. Texte passant C -> Java utilisant JNI
Vous pouvez utiliser [JNA] (https://github.com/twall/jna/) pour facilement passer des structures autour. JNA vous permet d'écrire votre liaison complètement dans le code Java. :-) –
Vous pouvez. Si vous voulez faciliter la traduction Java/C, consultez [Swig] (http://www.swig.org/), qui vous permet de traduire [entre Java et les structures C/C++] (http: // www. swig.org/Doc1.3/Java.html) d'une manière simple .. –