Swig:如何将“FILE”类型从C ++传递给Java

时间:2017-03-25 01:02:31

标签: java c++ file java-native-interface swig

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

这就是我所拥有的 -

C ++(theHeader.h):

#include <cstdio>

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

  private:
  FILE* file;
};

我尝试过编译,但是它导致了Swig指针类型的创建:SWIGTYPE_p_FILE,这对我将FILE类型参数从Java传递给C ++没有帮助。

1 个答案:

答案 0 :(得分:1)

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

爪哇:

// 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 );
}

或者,如果您已经拥有本机代码中的FILE *

long instance = getClassInstance( file );

原生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的本机定义始终为零值。从技术上讲,JNI进行C调用,而不是C ++调用,因此NULL可能无法保证始终实际定义为零,具体取决于您的体系结构以及如何在Java和本机代码之间编写接口。因此,要完全符合标准,NULL指针结果将导致返回到Java的jlong值显式设置为零。反向工作是因为C标准将零值定义为 a NULL指针值,该值与定义的NULL指针常量相等。 (请注意,可能有多个&#34; NULL指针值&#34;即使NULL本身只有一个定义。)