Я хотел бы перенести мою java программу с JDK8 на JDK11. Я исправил ошибки сборки, вызванные удалением API в JDK11.
Но у меня возникла проблема, связанная с JNI.
Чтобы объяснить эту проблему, давайте предположим, что у нас есть следующий файл java.
package mypkg;
public class JNITest {
static final int X_MINOR_MASK = 1;
}
Как видите, у него есть только одна переменная типа int, и метод не определен.
Когда я генерирую файл заголовка JNI с JDK8, я делаю следующие шаги.
1) Компиляция
javac -sourcepath ./mypkg -d $OUTPUT_DIR ./mypkg/JNITest.java
2) генерация заголовка
javah -jni -d $OUTPUT_DIR/jni -cp ./$OUTPUT_DIR mypkg.JNITest
Затем генерируется файл заголовка (mypkg_JNITest.h), как показано ниже:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class mypkg_JNITest */
#ifndef _Included_mypkg_JNITest
#define _Included_mypkg_JNITest
#ifdef __cplusplus
extern "C" {
#endif
#undef mypkg_JNITest_X_MINOR_MASK
#define mypkg_JNITest_X_MINOR_MASK 1L
#ifdef __cplusplus
}
#endif
#endif
Как вы знаете, JDK11 больше не поддерживает javah. Мы должны использовать вместо него javac -h.
Итак, я скомпилировал файл java, как показано ниже.
javac -h ./$OUTPUT_DIR/jni -sourcepath ./mypkg -d $OUTPUT_DIR ./mypkg/JNITest.java
Он скомпилирован хорошо, но файл jni не сгенерирован.
Чтобы проверить, генерирует ли файл jni собственный метод, я попытался использовать следующий файл java.
package mypkg;
public class JNITest {
static final int X_MINOR_MASK = 1;
public native int intMethod(int n);
}
Затем он успешно сгенерировал Файл JNI, как показано ниже.
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class mypkg_JNITest */
#ifndef _Included_mypkg_JNITest
#define _Included_mypkg_JNITest
#ifdef __cplusplus
extern "C" {
#endif
#undef mypkg_JNITest_X_MINOR_MASK
#define mypkg_JNITest_X_MINOR_MASK 1L
/*
* Class: mypkg_JNITest
* Method: intMethod
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_mypkg_JNITest_intMethod
(JNIEnv *, jobject, jint);
#ifdef __cplusplus
}
#endif
#endif
Последний вопрос: есть ли способ создать файл JNI с javac из JDK11 для файла java, который просто определяет 'stati c final int 'переменная?