使用本机C ++对象时,如何使JNI方法调用不是静态的?

时间:2011-01-11 23:40:22

标签: android java-native-interface android-ndk

我有以下JNI包装器C ++代码:

#include "map_container.h"
extern "C" {
    JNIEXPORT void JNICALL Java_com_map_Map_openMapNative(JNIEnv* env, jobject thiz, jstring path);
};

static map_container* map = NULL;

void Java_com_map_Map_openMapNative(JNIEnv* env, jobject thiz, jstring path)
{
  const char* filename_utf8 = env->GetStringUTFChars(path, false);

  if ( mapview )
  {
    delete mapview;
    mapview = NULL;
  }

  mapview = new map_container((char*)filename_utf8);

  if (filename_utf8)
  {
    env->ReleaseStringUTFChars(path, filename_utf8);
  }
}

并将com.map.Map.openMapNative声明为静态,这意味着我可以一次操作一张地图。如何修改此C ++代码以使map_container* map变为非静态且属于com.map.Map类的确切实例? map_container完全是C ++类,在Java中没有反射。

3 个答案:

答案 0 :(得分:2)

如果你在Java源代码中声明Map.openMapNative为“static native”,那么当前的声明会产生误导,因为第二个参数实际上是对Map类的引用(应该是“jclass clazz”而不是“jobject” THIZ“)。没关系,因为你没有使用“thiz”,而且每个jclass都是一个工作。

你创建这个非静态的方法是从Java端的声明中删除“static”,并开始使用“thiz”来访问实例的成员。

答案 1 :(得分:2)

我正在使用SWIG生成所有必需的包装器代码。您只需在接口定义文件中定义要包装的类和函数,然后让SWIG为您创建所有必需的C ++和Java代码。强烈推荐!手工编写JNI代码太过无聊且容易出错恕我直言。请参阅SWIG docs for Java,它非常易于使用。

答案 2 :(得分:0)

可能有点晚了,但这本食谱非常宝贵!

http://thebreakfastpost.com/2012/01/23/wrapping-a-c-library-with-jni-part-1/

乍一看,根据您的需要,SWIG可能会出现异常过分!