Один из способов сделать это - использовать указатель на функцию-член и изменить сигнатуру функции интегрирования.
См. Ниже общую идею:
functionwrapper.h
Объявите класс-оболочку функции.
class FunctionWrapper
{
public:
typedef double (FunctionWrapper::*Function1VariablePtr)(double x);
FunctionWrapper(JNIEnv*, jclass);
double compute(double x);
};
integrate.h
Удалите предыдущий указатель на функцию typedef и измените методподпись для включения объекта-оболочки и указатель на его функцию-член.
#include "functionwrapper.h"
extern "C" {
double DLL_MACRO integrate(FunctionWrapper*, FunctionWrapper::Function1VariablePtr, double min, double max);
}
integrate.cpp
Измените вызов функции на вызов функции-члена.
#include "integrate.h"
double integrate(FunctionWrapper* wrapper, FunctionWrapper::Function1VariablePtr function, double min, double max)
{
// ...
sum += (wrapper->*function)(xmid)*dx;
// ...
}
возврат суммы;}
Код "моста" JNI:
Определите код оболочки и определите функцию, которая выполняет фактический вызов.Вызовите функцию integrate
непосредственно из функции JNI:
#include "functionwrapper.h"
FunctionWrapper::FunctionWrapper(JNIEnv *jnienv, jclass jc) : m_jnienv(jnienv), m_jc(jc) {
m_method= jnienv->GetStaticMethodID(jc, "Function1D","(D)D");
}
double FunctionWrapper:compute(double x) {
return m_jnienv->CallStaticDoubleMethod(m_jc, m_method, x);;
}
// C++ "bridge" code to from/to Java:
JNIEXPORT jdouble JNICALL
Java_IntegrateJApp_JIntegrate(JNIEnv *jnienv, jclass jc,
jdouble xmin, jdouble xmax) {
FunctionWrapper wrapper(jnienv, jc);
return integrate(&wrapper, &FunctionWrapper::compute, 2, 3);
}