Класс создания файла заголовка JNI - PullRequest
0 голосов
/ 12 августа 2010

В настоящее время я использую JNI для генерации заголовков C для собственных методов, используемых в Java-классе ABC. Тем не менее, я хотел бы использовать эти методы в другом месте, в другом классе XYZ, поэтому я создал класс с именем cLib, который в основном имел прототипы нативных методов и который при генерации дал мне файл заголовка для необходимых мне методов. .

Проблема в том, что JNI присоединяет имя Java-класса, в котором был объявлен прототип, к имени функции в заголовочном файле, поэтому мне нужно было бы просто отдельно создать два заголовочных файла для каждого из классов Java ABC, XYZ

Best.

Ответы [ 2 ]

0 голосов
/ 12 августа 2010

Если посмотреть на этот вопрос с другой точки зрения ... нет проблем с включением нативного кода для нескольких классов в один файл LIB.c, используемый для создания "libPOW.so".

Рассмотрим следующее содержимое файла "LIB.c":

/* Common Header Files... including jni.h <em>/ /</em> * Class: your.pkg.Boo * Method: doSomething * Signature: (I)I */ JNIEXPORT jint JNICALL Java_your_pkg_Boo_doSomething( JNIEnv <em>env, jobject jobj, jint job) { ... } /</em> * Class: your.pkg.Wow * Method: doSomething * Signature: (I)I */ JNIEXPORT jint JNICALL Java_your_pkg_Wow_doSomething( JNIEnv *env, jobject jobj, jint job) { ... }

Затем скомпилируйте через:

$(CC) $(CCOPTS) [$(CCOPTS64)] $(JAVAOPTS) LIB.c -o libPOW.so Куда: CCOPTS == "-G -mt" (solaris) OR "-Wall -Werror -shared -shared-libgcc -fPIC" (Linux) CCOPTS64 == "-xcode=pic32 -m64" (SparcV9) OR "-m64" (AMD64) JAVAOPTS == "-I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/$(OSNAME) -I."

Cheers, leoJava

0 голосов
/ 12 августа 2010

Три варианта:

  1. Вызов тех же библиотечных методов из Java.

public class Boo { public V doSomething(...) { return (Common.doSomething(...)); } } public class Wow { public V doSomething(...) { return (Common.doSomething(...)); } } public class Common { public static native V doSomething(...); } /** Trivial JNI Implementation omitted... */

Вызовите те же библиотечные методы из C / Assembly.

public class Boo { public V native doSomething(...); } public class Wow { public V native doSomething(...); } /** Both JNI methods call same C/Assembly native function, similarly... */

Дублировать код автоматически.;)

см. java.lang.Compiler

Приветствия, leoJava

...