JNI를 사용하여 Java에서 C로 사용자 정의 데이터 유형을 전달할 수 있습니까? C에서 원시 데이터 유형의 매핑을 볼 수 있지만 우리가 자체 데이터 유형 (예 : 전체를 전송하거나 Employee 객체 또는 무엇인가를 반환 할 수 있는지 여부)을 보낼 수 있는지는 확실하지 않습니다.JNI를 사용하여 Java에서 C로 또는 그 반대로 데이터 유형 전달
답변
많은 개체로이 작업을 수행하려는 경우 Swig과 같은 것이 가장 좋습니다. jobject 유형을 사용하여 사용자 정의 객체를 전달할 수 있습니다. 구문은 좋지 않습니다. 아마도 이것을 쓰는 더 좋은 방법이있을 것입니다.
예 Employee 객체 :
public class Employee {
private int age;
public Employee(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
전화 일부 클라이언트에서이 코드 :
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);
}
당신은하는 jobject 방법으로, C 자바에서 직원 개체를 전달하는이 같은 JNI 기능을 가질 수
인수 :
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;
}
직원 개체를 C에서 Java로 다시 jobje로 전달 ct이면 다음을 사용할 수 있습니다.
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;
}
"LEmployee;에 문제가 있습니다." 파트 "com.pak1.Employee"와 "Lcom.pak.Employee;"로 시도했습니다. 그러나 아무 결과도, 어떤 생각? – Lukap
@Lukap : 클래스가 com.pak.Employee 인 경우 클래스의 서명은 "Lcom/pak/Employee"가됩니다. – nautilusvn
'String'에서 어떻게 작동하는지 알고 있습니까? – mafioso
- 1. java에서 perl로 데이터 구조 전달 (및 그 반대로)
- 2. Java에서 클래스를 문자열로 또는 그 반대로 캐스팅
- 3. PHP에서 Javascript 및 그 반대로 데이터 전달
- 4. 루비 배열을 문자열로 또는 그 반대로 변환
- 5. HTML5 캔버스에서 XML로 또는 그 반대로
- 6. MinGW에서 msysGit 사용 (또는 그 반대로)
- 7. 바이트 배열에서 문자열로 이미지 (또는 그 반대로)
- 8. OpenCV 이미지 데이터 형식을 악마 이미지 형식으로 변환하거나 그 반대로
- 9. JNI를 사용하여 Java에서 CDialog를 엽니 다.
- 10. 바이너리에서 텍스트 모드로 또는 그 반대로 iostream을 전환하는 방법은 무엇입니까?
- 11. 북마크릿에서 Firefox 확장자에 액세스하는 방법 (또는 그 반대로)
- 12. 값을 C로 전달
- 13. wpf DocumentViewer - GlyphRun으로 ITextPointer 얻고 그 반대로
- 14. Ruby에서 float 숫자를 이진 문자열로 변환하는 방법 (또는 그 반대로)
- 15. 배열을 문자열로 또는 그 반대로 변환하는 방법은 무엇입니까?
- 16. 오디오, mp3 파일을 문자열로 또는 그 반대로 변환
- 17. 자바 스크립트에서 자바 스크립트로 (또는 그 반대로) 이전 가이드가 있습니까?
- 18. 클라이언트에서 서버로 스테 가노 그래픽 메시지 보내기 또는 그 반대로
- 19. 포인터를 통해 배열을 사용하는 경우 또는 그 반대로 사용하는 경우
- 20. 테이블에서 테이블 행 객체 가져 오기 또는 그 반대로
- 21. 보기가 potrait에서 landscape 또는 그 반대로 바뀔 때 작동하지 않음
- 22. 로컬 데이터베이스와 원격 데이터베이스 동기화 또는 그 반대로
- 23. 부호없는 바이트를 부호있는 바이트로 또는 그 반대로 부호를
- 24. .net C#을 PHP로 또는 그 반대로 변환하는 방법은 무엇입니까?
- 25. 로컬 클라이언트 시스템 시간에서 CST로 또는 그 반대로 변환
- 26. C에서 C++로 또는 그 반대로 포인터를 전달하는 경우
- 27. OpenCV에서 RGB로 YCbCr로 또는 그 반대로 손으로 (Visual C++)
- 28. 컴파일러가 정수를 문자열로 또는 그 반대로 변환하는 방법
- 29. 픽셀을 인치로 변환하거나 그 반대로 변환하기 C#
- 30. 오디오를 코드로 변환하거나 그 반대로 변환
[JNA] (https://github.com/twall/jna/)를 사용하면 쉽게 구조를 전달할 수 있습니다. JNA는 자바 코드로 바인딩을 완벽하게 작성할 수있게 해준다. :-) –
하실 수 있습니다. Java/C 번역을보다 쉽게 만들고 싶다면 [Swig] (http://www.swig.org/)에서 [Java와 C/C++ 구조체] (http : // www. swig.org/Doc1.3/Java.html)을 간단하게 사용할 수 있습니다. –