返回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
}