簡體   English   中英

通過 JNI 從 C 調用 Java 可變參數 function

[英]Calling a Java variadic function from C through the JNI

我目前正在為我工作的 C 庫創建一些 Java 綁定。 我們的 C 結構之一有一個字符緩沖區,它是一個文件系統路徑。 調用 C function 后,緩沖區已正確填充。 我想獲取緩沖區並將其轉換為java.nio.file.Path上的 java.nio.file.Path 成員。

但是我遇到了一些麻煩。 由於某種原因,我在 C 中生成了NullPointerException ,但我看不出問題所在。

創建java.nio.file.Path object 的方法是通過java.nio.file.Paths::get()

以下是相關的 C 代碼:

const jclass paths_class = (*env)->FindClass(env, "java/nio/file/Paths");
if ((*env)->ExceptionCheck(env))
    return;
const jmethodID get_method = (*env)->GetStaticMethodID(
    env, paths_class, "get", "(Ljava/lang/String;[Ljava/lang/String;)Ljava/nio/file/Path;");
if ((*env)->ExceptionCheck(env))
    return;
const jstring path_str = (*env)->NewStringUTF(env, info.mi_path);
if ((*env)->ExceptionCheck(env))
    return;
const jobject path_obj =
   (*env)->CallStaticObjectMethod(env, paths_class, get_method, path_str); // exception generated here
if ((*env)->ExceptionCheck(env))
    return;

和 Java class 很好的措施:

public final class MclassInfo {
    private native void _get(final Kvdb kvdb, Mclass mclass) throws HseException;

    private long allocatedBytes;
    private long usedBytes;
    private Path path;

    MclassInfo(final Kvdb kvdb, final Mclass mclass) throws HseException {
        _get(kvdb, mclass);
    }

    public long getAllocatedBytes() {
        return allocatedBytes;
    }

    public long getUsedBytes() {
        return usedBytes;
    }

    public Path getPath() {
        return path;
    }
}

我能想到的是,不知何故我沒有正確調用 Java 可變參數 function。 我還嘗試將NULL作為方法調用的額外參數傳遞,但最終遇到了同樣的問題。

您嘗試調用的方法被聲明為get(String first, String... more) Java 中的可變參數語法只是指定類型數組的糖,即此方法的兩個arguments 實際上是StringString[] - 您在GetStaticMethodID調用中正確編碼為(Ljava/lang/String;[Ljava/lang/String;)

因此,要調用它,您需要兩個arguments:一個String和一個String[] (數組) ——並且(對於您的情況)該數組必須包含零個元素,但這樣的空數組與NULL不同。 看看NewObjectArray

暫無
暫無

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

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