Android ndk 子类a C++;使用JNI的Java抽象类 我有一个C++库,我必须在现有的Android实现中使用它。我使用Android NDK,并通过JNI使用C++类。p> 但是,我不能找到如何使用JNI .在java中对C++抽象类进行子类化。
我面临的问题: 我的目的是通过对抽象C++类进行子类化,为C++中的虚拟方法提供java实现。 我已经加载了本机库,正在尝试声明本机方法。 C++方法具有关键词“虚”。在加载C++库后,在java中声明本机函数时,“虚拟”是不被识别的。这里怎么了Android ndk 子类a C++;使用JNI的Java抽象类 我有一个C++库,我必须在现有的Android实现中使用它。我使用Android NDK,并通过JNI使用C++类。p> 但是,我不能找到如何使用JNI .在java中对C++抽象类进行子类化。,android-ndk,java-native-interface,Android Ndk,Java Native Interface,我面临的问题: 我的目的是通过对抽象C++类进行子类化,为C++中的虚拟方法提供java实现。 我已经加载了本机库,正在尝试声明本机方法。 C++方法具有关键词“虚”。在加载C++库后,在java中声明本机函数时,“虚拟”是不被识别的。这里怎么了 感谢您的帮助。我是JNI的新手。提前谢谢 >我们考虑C++类: class iVehicle { public: virtual void Run() {}; // not-pure virtual here for simplicity of
感谢您的帮助。我是JNI的新手。提前谢谢 >我们考虑C++类:
class iVehicle
{
public:
virtual void Run() {}; // not-pure virtual here for simplicity of a wrapper, but could be pure (see the end of the post)
virtual int GetSize() const; // we want to reuse it in Java
};
我们想在爪哇中创建一个类<代码> BOT,扩展了类<代码> iWoR>代码>,从调用“代码>超级代码/CUT>”调用C++代码从
在java中使用C++类,需要生成一个java包装器,即:
class iVehicle
{
public void Run() { Native_Run(); }
public int GetSize() { return Native_GetSize(); }
private native void Native_Run();
private native int Native_GetSize();
// typecasted to pointer in C++
private int NativeObjectHolder;
// create C++ object
native static private int CreateNativeObject();
}
Java中的用法很简单:
class Bot extends iVehicle
{
public int GetSize()
{
if ( condition ) return 0;
// call C++ code
return super.GetSize();
}
}
但是,这个代码有C++部分:
static jfieldID gNativeObjectHolderFieldID;
JNIEXPORT void JNICALL Java_com_test_iVehicle_Run( JNIEnv* env, jobject thiz )
{
int Value = env->GetIntField(thiz, gNativeObjectHolderFieldID);
iVehicle* Obj = (iVehicle*)Obj;
// todo: add checks here, for NULL and for dynamic casting
Obj->Run();
}
类似的代码用于GetSize()
然后创建Java的Bot
实例,您必须调用CreateNativeObject()
并将返回值分配给NativeObjectHolder
字段
JNIEXPORT int JNICALL Java_com_test_iVehicle_CreateNativeObject( JNIEnv* env, jobject thiz )
{
iVehicle* Obj = new iVehicle;
return (int)Obj;
}
所以,这就是计划。为了使这项工作,您需要添加销毁代码并解析C++类来生成所有的胶粘代码。
添加:
如果IVehile
实际上是抽象的,则必须生成一个非抽象包装,以便能够实例化:
class iVehicle
{
virtual void Run() = 0;
}
class iVehicle_Wrapper: public iVehicle
{
virtual void Run() { ERROR("Abstract method called"); };
}
并在
CreateNativeObject()
中实例化iVehicle\u包装器。呜呜啦!在java中继承了C++类。你会发现JNI胶不把java绑定到C++类。为此,您需要围绕JNI构建一些东西。是有用的,但并不像你描述的那样。我敢打赌,你不会发现任何东西,避免手工创建一个具体的C++类并包装它。@对于创建包装,您是否建议使用SWIG之类的工具,或者是否有其他方法来创建包装?也请看一看。谢谢您的详细回复。java C++ C++类的java类实现,如果想在C++中使用java类子类,那么在C++中使用Java子类是这个故事的续集。您需要生成一个wrapperiVehicle\u wrapper
,它将保存Java对象/方法的ID,并使用JNI调用它。我建议您调查对等类。您将使用一个Java代理类,用于< C++ >代码> > java,它是java方面的C++类的抽象类。在C++端,您需要实现一个具体的实现,实现了所有抽象的虚拟函数,将它们用JNI转发给java代理。