簡體   English   中英

使用JNI將數據類型從Java傳遞到C(反之亦然)

[英]Passing data types from Java to C (or vice versa) using JNI

使用JNI,我們可以將自定義數據類型從Java傳遞到C(反之亦然)嗎? 我看到原始數據類型到C中類型的映射,但是不太確定我們是否可以跨自己的數據類型發送(例如,跨對象發送或返回Employee對象!)。

如果要對許多對象執行此操作,則最好使用Swig之類的方法。 您可以使用jobject類型來傳遞自定義對象。 語法不是很好,也許有更好的方式編寫此代碼。

員工對象示例:

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的功能,用於將員工對象從Java傳遞到C,作為jobject方法參數:

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM