将 C++ double* 转换为 Java double
Converting C++ double* to a Java double
我正在努力解决一个基本问题。我正在尝试使用以下签名从 Java 调用 .dll
-函数:
int function(double* a, double b);
我的问题是我不知道如何使用Java中的double* a
参数以及如何在函数调用完成后打印操作值。
我认为最简单的情况就是返回输出,使用长度为 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
使用 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());
}
}
我正在努力解决一个基本问题。我正在尝试使用以下签名从 Java 调用 .dll
-函数:
int function(double* a, double b);
我的问题是我不知道如何使用Java中的double* a
参数以及如何在函数调用完成后打印操作值。
我认为最简单的情况就是返回输出,使用长度为 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
使用 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());
}
}