将C++中的double*转换为Java的double

3

我遇到了一个基础问题。我正试图调用以下签名的 .dll 函数:

int function(double* a, double b);

我的问题是我不知道如何在Java中使用double* a参数,并且不知道如何在函数调用完成后打印出操作后的值。


1
可能是如何在JNI中从Java传递指针到C?的重复问题。 - user1
我尝试仅将变量作为简单的双精度传递。这个函数需要通过引用调用,因为变量a也是返回值。int值只是一个错误代码。 - wurmi
JNA提供了DoubleByReference来实现这个目的,虽然您也可以使用原始数组。 - technomage
2个回答

6

我认为对于最简单的情况,只需使用长度为1的双[]返回输出。

这是我的java文件(usefunc.java):

public class usefunc {

    static {
        System.loadLibrary("usefunc");
    }
    public native int function(double a[], double b);

    public static void main(String args[]) {
        double a[] = new double[1];
        new usefunc().function(a,1.0);
        System.out.println("a[0] = " + a[0]);
    }
}

这是我的C++文件(usefunc.cpp):
#include <jni.h>

extern "C" {
    JNIEXPORT jint JNICALL Java_usefunc_function
    (JNIEnv *env, jobject obj, jdoubleArray a, jdouble b);
    int function(double *a, double b);
}

int function(double* a, double b) {
    *a = 77.7;
    return 0;
}

/*
 * Class:     usefunc
 * Method:    function
 * Signature: ([DD)I
 */
JNIEXPORT jint JNICALL Java_usefunc_function
(JNIEnv *env, jobject obj, jdoubleArray a, jdouble b) {
    jboolean iscopy;
    double *nativeA = env->GetDoubleArrayElements(a, &iscopy);
    jint ret = function(nativeA, b);
    env->ReleaseDoubleArrayElements(a, nativeA, 0);
    return ret;
}

编译使用的:

 g++ -I /usr/local/jdk1.8.0_60/include/ -I /usr/local/jdk1.8.0_60/include/linux/ -shared usefunc.cpp  -o libusefunc.so
 javac usefunc.java

使用以下内容运行:

 java usefunc

生成:

 a[0] = 77.7

非常感谢!简洁明了。解决了我的问题。 - wurmi

3

使用JNA,避免除目标共享库外的任何本地编译:

public class usefunc {

    static {
        Native.register("usefunc");
    }
    public static native int function(double a[], double b);
    public static native int function(DoubleByReference dp, double b);

    public static void main(String args[]) {
        double a[] = new double[1];
        usefunc.function(a,1.0);
        System.out.println("a[0] = " + a[0]);

        DoubleByReference dp = new DoubleByReference();
        usefunc.function(dp,1.0);
        System.out.println("dp = " + dp.getValue());
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接