2010-03-23 6 views
27

JNI를 사용하여 Java에서 C로 사용자 정의 데이터 유형을 전달할 수 있습니까? C에서 원시 데이터 유형의 매핑을 볼 수 있지만 우리가 자체 데이터 유형 (예 : 전체를 전송하거나 Employee 객체 또는 무엇인가를 반환 할 수 있는지 여부)을 보낼 수 있는지는 확실하지 않습니다.JNI를 사용하여 Java에서 C로 또는 그 반대로 데이터 유형 전달

+0

[JNA] (https://github.com/twall/jna/)를 사용하면 쉽게 구조를 전달할 수 있습니다. JNA는 자바 코드로 바인딩을 완벽하게 작성할 수있게 해준다. :-) –

+0

하실 수 있습니다. Java/C 번역을보다 쉽게 ​​만들고 싶다면 [Swig] (http://www.swig.org/)에서 [Java와 C/C++ 구조체] (http : // www. swig.org/Doc1.3/Java.html)을 간단하게 사용할 수 있습니다. –

답변

61

많은 개체로이 작업을 수행하려는 경우 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; 
} 
+2

"LEmployee;에 문제가 있습니다." 파트 "com.pak1.Employee"와 "Lcom.pak.Employee;"로 시도했습니다. 그러나 아무 결과도, 어떤 생각? – Lukap

+1

@Lukap : 클래스가 com.pak.Employee 인 경우 클래스의 서명은 "Lcom/pak/Employee"가됩니다. – nautilusvn

+0

'String'에서 어떻게 작동하는지 알고 있습니까? – mafioso

관련 문제