Android ndk 子类a C++;使用JNI的Java抽象类 我有一个C++库,我必须在现有的Android实现中使用它。我使用Android NDK,并通过JNI使用C++类。p> 但是,我不能找到如何使用JNI .在java中对C++抽象类进行子类化。

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

我面临的问题: 我的目的是通过对抽象C++类进行子类化,为C++中的虚拟方法提供java实现。 我已经加载了本机库,正在尝试声明本机方法。 C++方法具有关键词“虚”。在加载C++库后,在java中声明本机函数时,“虚拟”是不被识别的。这里怎么了


感谢您的帮助。我是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++代码从 IORo::GETSIZE()/CUD>,从C++的观点,我们可以使用<代码> BOT作为“代码> iBoo**/Cudio>变量。这很困难,因为C++没有提供良好的内置反射功能。p> 这里有一个可能的解决方案。

在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子类是这个故事的续集。您需要生成一个wrapper
iVehicle\u wrapper
,它将保存Java对象/方法的ID,并使用JNI调用它。我建议您调查对等类。您将使用一个Java代理类,用于< C++ >代码> > java,它是java方面的C++类的抽象类。在C++端,您需要实现一个具体的实现,实现了所有抽象的虚拟函数,将它们用JNI转发给java代理。