gpt4 book ai didi

java - 在 Java 中使用 C++ 函数

转载 作者:行者123 更新时间:2023-11-30 03:06:08 25 4
gpt4 key购买 nike

我有一个包含一些 .cpp 和 .h 文件的 C++ 项目。其中一个 .cpp 具有带有此签名的函数:

int** verts(int L, int W, int l, int w)

我想在 Java 项目中使用这个函数。是的,我可以用 Java 重写它,但它是一个非常清晰的函数。从 Java 调用此函数(并获得整数矩阵)会很棒。

有什么想法吗?
请考虑我是一名 Java 程序员,我在 C++ 方面非常菜鸟 :P

最佳答案

你可以编写一个包含这个函数的库,并用一个 JNI 包装器,但这并不简单。最重要的问题是int** 真正代表什么,以及它们是如何管理的:是否和您必须如何删除它们,以及您希望如何在 Java 中表示它们。只是猜测,我怀疑指针指向一个int*的数组,其中每一个都指向一个int数组;这是一个常见的C 中二维数组的表示(但不是我们想要的通常在 C++ 中使用)。至于是否以及如何删除它们,这个应该由定义 verts 的库记录。鉴于,您首先必须在 Java 类中将该函数声明为 native 函数:

class Verts
{
static {
System.loadLibrary( "<i>libraryName</i>" );
}

private static Integer[] nativeVerts( int L, int W, int l, int w );
public Integer[][] verts( int L, int W, int l, int w )
{
Integer[] tmp = nativeVerts( L, W, l, w );
// reshape tmp...
return reshapedData;
}
}

(我更喜欢返回一个扁平化的一维数组,而不是而不是 Integer[][]。它将使 C++ 更简单。)

您需要做的是按照以下几行编写一个函数:

#include "jni.h"
extern "C" JNIEXPORT jIntArray JNICALL Java_Verts_nativeVerts(
JNIEnv* env,
jclass,
jint L,
jint W,
jint l,
jint w)
{
int** results = verts( L, W, l, w );
std::vector<int> tmp;
// Fill tmp with the flattened results.
// Then do whatever you have to do to clean up the int**.
jintArray jResults = env->newIntArray( tmp.size() );
env->SetIntArrayRegion( jResults, 0, tmp.size(), &tmp[0] );
return jResults;
}

除了上述还需要相当多的错误检查。

最后,用你给的名字编译并链接上面的dllJava 端的 System.loadLibrary() 函数。并确保您的环境已设置,以便 Java 可以找到 dll(通过$LD_LIBRARY_PATH (Unix) 或 %path% (Windows),或通过传递路径-Djava.library.path=... 在 Java 命令行上的方法)。

关于java - 在 Java 中使用 C++ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6957606/

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