我已经在C++中编写了以下代码用于数值积分:
现在我想从Java中调用这个函数。我找到了如何直接在JNI“桥”代码中实现集成:
// integrate.h:
#ifdef BUILDING_DLL
#define DLL_MACRO __declspec(dllexport)
#else
#define DLL_MACRO __declspec(dllimport)
#endif
extern "C" {
typedef double (*Function1VariablePtr)(double x);
double DLL_MACRO integrate(Function1VariablePtr function, double min, double max);
}
// integrate.cpp:
#include "integrate.h"
double integrate(Function1VariablePtr function, double min, double max) {
const int n = 1001;
double dx = (max - min)/(1.0*(n - 1));
double sum = 0.0;
for(int i = 0; i < n; i++) {
double xmid = min + (i + 0.5)*dx;
sum += function(xmid)*dx;
}
return sum;
}
现在我想从Java中调用这个函数。我找到了如何直接在JNI“桥”代码中实现集成:
// C++ "bridge" code to from/to Java:
JNIEXPORT jdouble JNICALL
Java_IntegrateJApp_JIntegrate(JNIEnv *jnienv, jclass jc,
jdouble xmin, jdouble xmax) {
jmethodID mid = jnienv->GetStaticMethodID(jc, "Function1D","(D)D");
if (mid == 0)
return - 1.0;
const int n = 1001;
double dx = (xmax - xmin)/(1.0*(n - 1));
double sum = 0.0;
for(int i = 0; i < n; i++) {
double xmid = xmin + (i + 0.5)*dx;
double f = jnienv->CallStaticDoubleMethod(jc, mid, xmid);
sum += f*dx;
}
return sum;
}
// Java code calling "bridge":
class IntegrateJApp {
public static void main(String[] args) {
System.loadLibrary("JIntegrate");
double I = JIntegrate(0.0, 2*Math.PI);
System.out.println( Double.toString(I) );
}
public static double Function1D(double x) {
return Math.sin(x);
}
public static native double JIntegrate(double xmin, double xmax);
}
然而,我不想在C++桥接代码中直接实现数值积分,而是调用integrate.cpp中的代码。
我该如何做? integrate.cpp中的integrate()函数需要一个函数指针,而我没有。 有没有办法使用JNI在Java中获取函数指针?
感谢您提前的任何答案!