我有以下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中没有反射。
答案 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可能会出现异常过分!