Невозможно создать файл заголовка JNI с JDK11 javac для файла класса только переменной - PullRequest
4 голосов
/ 10 марта 2020

Я хотел бы перенести мою 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 'переменная?

1 Ответ

6 голосов
/ 10 марта 2020

Просто пометьте поле с помощью @Native

package mypkg;

import java.lang.annotation.Native;

public class JNITest {
    @Native
    static final int X_MINOR_MASK = 1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...