gpt4 book ai didi

java - 无法使用 JDK11 javac 为仅变量类文件创建 JNI 头文件

转载 作者:行者123 更新时间:2023-12-01 12:47:53 34 4
gpt4 key购买 nike

我想将我的 java 程序从 JDK8 迁移到 JDK11。
我解决了由 JDK11 中删除的 API 引起的构建错误。

但是,我遇到了 JNI 相关的问题。

为了解释这个问题,让我们假设我们有以下 java 文件。

package mypkg;

public class JNITest {
static final int X_MINOR_MASK = 1;
}

如您所见,它只有一个 int 变量,并且没有定义任何方法。

当我使用JDK8生成JNI头文件时,我执行以下步骤。

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 文件。

为了测试它是否在具有 native 方法时生成 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

最后的问题:
有没有办法用JDK11的javac为一个只定义一个'static final int'变量的java文件生成一个JNI文件?

最佳答案

只需用 @Native 标记该字段

package mypkg;

import java.lang.annotation.Native;

public class JNITest {
@Native
static final int X_MINOR_MASK = 1;
}

关于java - 无法使用 JDK11 javac 为仅变量类文件创建 JNI 头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60619961/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com