gpt4 book ai didi

java - Swig:如何将 "FILE"类型从 C++ 传递到 Java

转载 作者:行者123 更新时间:2023-11-28 05:14:04 25 4
gpt4 key购买 nike

我有一个 C++ 函数,我需要为它创建一个 Java 包装器。该函数需要一个 FILE 类型的输入参数(来自 stdio)。我不相信 Swig 可以在没有 swig 接口(interface)文件中的一些手动工程的情况下自动使用 Java 中的接口(interface) - 我可能是错的。

这是我的——

C++ (theHeader.h):

#include <cstdio>

class SampleClass
{
public:
SampleClass(FILE* file) : file(file)
{
}

private:
FILE* file;
};

我尝试过编译,但它导致创建了 Swig 指针类型:SWIGTYPE_p_FILE,这无法帮助我将 FILE 类型参数从 Java 传递到 C++。

最佳答案

为什么为此使用 SWIG?这对于直接使用 JNI 来说非常简单(假设指针适合系统架构的 jlong​​ 值,这通常是一个非常安全的假设):

Java:

// get an instance of the native C++ class
static native long getClassInstance();

static native long getClassInstance( long file );

// get the native FILE * from the class instance
static native long getFileFromClass( long cls );

// close the FILE *
static native void closeFile( long file );

你会像这样使用它:

long file = 0;
long cls = getClassInstance();
if ( cls != 0 )
{
file = getFileFromClass( cls );
}

或者,如果您已经从 native 代码中获得了 FILE *:

long instance = getClassInstance( file );

native C++ 代码看起来像这样(我懒得从上面的 Java 代码中完成完整的 javac 工作):

JNIEXPORT jlong JNICALL some_class_getClassInstance(
JNIenv *env, jclass cl )
{
myClass *cls = new MyClass();
return( ( jlong )( intptr_t ) cls );
}

JNIEXPORT jlong JNICALL some_class_getClassInstance(
JNIenv *env, jclass cl, jlong file )
{
FILE *fp = ( FILE * )( intptr_t ) file;
myClass *cls = new MyClass( fp );
return( ( jlong )( intptr_t ) cls );
}

JNIEXPORT jlong JNICALL some_class_getFileFromClass(
JNIenv *env, jclass cl, jlong cls )
{
myClass *instance = ( myClass * )( intptr_t ) cls;

FILE *fp = myClass->getFile();

return( ( jlong )( intptr_t ) fp );
}

JNIEXPORT void JNICALL some_class_name_closeFile(
JNIenv *env, jclass cls, jlong file )
{
FILE *fp = ( FILE * ) ( intptr_t ) file;
fclose( fp );
}

请注意,代码假定 NULL 的 native 定义始终为零值。从技术上讲,JNI 进行 C 调用,而不是 C++ 调用,因此可能无法保证 NULL 始终实际定义为零,具体取决于您的体系结构以及您如何编写 Java 和 native 之间的接口(interface)代码。因此,为了完全符合标准,NULL 指针结果将导致返回到 Java 的 jlong​​ 值显式设置为零。反之亦然,因为 C 标准将零值定义为 a NULL 指针值,它比较等于定义的 NULL 指针常量。 (请注意,即使 NULL 本身只有一个定义,也可以有多个“NULL 指针值”。)

关于java - Swig:如何将 "FILE"类型从 C++ 传递到 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43011386/

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