Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
返回C++;对象到Java 我得到了一些JNI函数,它们必须在同一C++对象上工作。我想将该对象保存在调用JNI函数的java对象中,但java似乎无法存储指针,以便以后访问函数_Java_C++_Java Native Interface - Fatal编程技术网

返回C++;对象到Java 我得到了一些JNI函数,它们必须在同一C++对象上工作。我想将该对象保存在调用JNI函数的java对象中,但java似乎无法存储指针,以便以后访问函数

返回C++;对象到Java 我得到了一些JNI函数,它们必须在同一C++对象上工作。我想将该对象保存在调用JNI函数的java对象中,但java似乎无法存储指针,以便以后访问函数,java,c++,java-native-interface,Java,C++,Java Native Interface,好吧,我意识到我在解释自己时做得很糟糕,所以这里有一个例子: void clear_numbers(JNIEnv *env, jobject me) { me.myCppVector.clear(); } void set_number(JNIEnv *env, jobject me, jint index, jint num) { me.myCppVector[index]=num; } jint get_number(JNIEnv *env, jobject me, jint

好吧,我意识到我在解释自己时做得很糟糕,所以这里有一个例子:

void clear_numbers(JNIEnv *env, jobject me) {
   me.myCppVector.clear();
}

void set_number(JNIEnv *env, jobject me, jint index, jint num) {
   me.myCppVector[index]=num;
}

jint get_number(JNIEnv *env, jobject me, jint index) {
   returnme.myCppVector[index];
}
我的问题是创建jobject.myCppVector,以便能够从不同的函数调用中使用它


我希望有人能理解我的胡言乱语

我认为标准的方法是使用java语言中的long来存储指针,这样您的java代码就可以在32位和64位系统上工作。显然,您需要为每个平台编译一个不同的C++ .so/dll。

这样,一个C++类的简单java包装器,用一种方法将看起来像:

class JavaClass
{
    private long native_ptr = 0;
    private native long createNativeInstance( params );
    private native String nativeMethod( params );
    private native void destroyNativeInstance( long p_native_ptr );
    public JavaClass( params )
    {
        this.native_ptr = createNativeInstance( params );
    }
    public String javaMethod( params )
    {
        nativeMethod( this.native_ptr, params );
    }
    public void finalize()
    {
        destroyNativeInstance( this.native_ptr );
    }
}
< >你的C++包装代码看起来像这样。(我已经命名C++类<代码> CppClass <代码> >


可能会将指针转换为整数,然后将整数存储到Java对象的字段中,这不是不安全的吗?另外,在所有平台上,sizeof(jint)等于sizeof(void*)吗?我不知道任何不安全的原因。但是,指针在不同的平台上有不同的大小,而Java原语类型没有,当然这意味着您需要将指针映射到Java代码中不同类型的原语-int为32位,long为64位,等等。另一种方法是在本机代码中定义“全局”std::map,这样,您就可以将指针存储在其中,并且永远不会将它们传递给Java代码(无论如何,Java代码将无法将它们用于任何特定用途)。是的,我想这肯定比我以前的建议好。那么,你每节课都有一张地图
JNIEXPORT jlong JNICALL Java_JavaClass_createNativeInstance
    ( JNIEnv*   p_jenv
    , jobject   p_jthis
    , params )
{
    // Convert params from Java types to C++ types if required
    return (jlong) new CppClass( converted_params );
}

JNIEXPORT void JNICALL Java_JavaClass_destroyNativeInstance
    ( JNIEnv*   p_jenv
    , jobject   p_jthis
    , jlong     p_native_ptr )
{
    if( p_native_ptr )
        delete (CppClass*)p_native_ptr;
}

JNIEXPORT jstring JNICALL Java_JavaClass_nativeMethod
    ( JNIEnv*   p_jenv
    , jobject   p_jthis
    , jlong     p_native_ptr
    , params
    )
{
    // Convert params from Java types to C++ types if required
    std::string cpp_result = ((CppClass*)p_native_ptr)->cppMethod( converted_params );
    jstring java_result = p_jenv->NewStringUTF( cppResult.c_str() );
    return java_result;
    // NOTE: std::string destructor will free cpp_result memory
}