programing

JNI를 사용하여 Java에서 C로 데이터 유형 전달(또는 그 반대)

muds 2023. 10. 28. 08:20
반응형

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

반응형