Как сделать вызов метода JNI нестатичным при использовании собственных объектов C ++? - PullRequest
4 голосов
/ 12 января 2011

У меня есть следующий код C ++ оболочки JNI:

#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 ]

2 голосов
/ 12 января 2011

Я использую SWIG для генерации всего необходимого кода оболочки. Вы просто определяете классы и функции, которые хотите обернуть, в файле определения интерфейса, и позволяете SWIG создавать для вас весь необходимый код C ++ и Java. Настоятельно рекомендуется! Написание кода JNI вручную слишком скучно и подвержено ошибкам ИМХО. См. Документацию SWIG для Java , она очень проста в использовании.

2 голосов
/ 12 января 2011

Если вы объявили Map.openMapNative как «статический нативный» в исходном коде Java, текущее объявление вводит в заблуждение, поскольку второй аргумент на самом деле является ссылкой на класс Map (должен быть «jclass clazz», а не «jobject» Thiz "). На самом деле это не имеет значения, так как вы не используете "thiz", и каждый jclass является объектом задания.

Способ сделать это нестатичным состоит в том, чтобы удалить «static» из объявления на стороне Java и начать использовать «thiz» для доступа к членам экземпляра.

0 голосов
/ 10 февраля 2013

Может быть, немного поздно, но эта кулинарная книга здесь неоценима!

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

На первый взгляд, и, в зависимости от того, что вам нужно, SWIG может быть чрезмерно мета!

...