gpt4 book ai didi

java - 从 C++ 回调到 Java

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:35:52 26 4
gpt4 key购买 nike

我在 C++ 中为数值积分编写了以下代码:

// 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 内部函数的指针?

提前感谢您的回答!

最佳答案

您必须使用您的 C++ 代码创建一个 DLL 并从 JNI 调用它

加载动态链接库:

System.loadLibrary("PATH\\yourdllname.dll");

创建函数链接

public static native integrate(parameters);

关于java - 从 C++ 回调到 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6383358/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com