繁体   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