반응형
JNI를 사용하여 Java에서 C로 데이터 유형 전달(또는 그 반대)
JNI를 사용하면 사용자 지정 데이터 유형을 Java에서 C로 전달할 수 있습니까?원시 데이터 유형을 C의 유형으로 매핑하는 것을 볼 수 있지만 자체 데이터 유형 간에 전송할 수 있는지는 확실하지 않습니다(예: Employee 개체를 가로채거나 반환합니다!).
많은 물체를 가지고 이것을 할 것이라면, Swig와 같은 것이 가장 좋을 것입니다.작업 개체 유형을 사용하여 사용자 지정 개체를 전달할 수 있습니다.구문이 좋지 않아요, 아마 더 좋은 방법이 있을 거예요.
예제 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);
}
JNI 함수는 Jobject method 인수와 같이 직원 객체를 Java에서 C로 전달하는 데 사용할 수 있습니다.
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로 다시 전달하면 다음을 사용할 수 있습니다.
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;
}
언급URL : https://stackoverflow.com/questions/2504334/passing-data-types-from-java-to-c-or-vice-versa-using-jni
반응형
'programing' 카테고리의 다른 글
워드 프레스 로그인 후 참조 페이지로 리디렉션 (0) | 2023.10.28 |
---|---|
ng반복에서 애니메이트를 지연시키는 방법 (0) | 2023.10.28 |
운영 체제 컴파일 시간 (0) | 2023.10.28 |
사용자 지정 쿼리로 가져온 wordpress의 post_content에서 모든 시각적 작곡가 숏코드/태그를 제거하는 방법 (0) | 2023.10.28 |
브리지 네트워크에서 컨테이너의 IP를 가져오는 방법 (0) | 2023.10.28 |