GraalVM native-image构建报错:sun.invoke.util.ValueConversions.booleanToInt方法缺失
解决GraalVM Native Image运行JNA应用时找不到sun.invoke.util.ValueConversions.booleanToInt的问题
问题原因
GraalVM原生镜像构建时,默认不会自动收集JDK内部API(如sun.invoke.util.ValueConversions)的反射元数据,而JNA在处理类型转换(如boolean转int)时会通过反射调用该类的booleanToInt方法,导致运行时抛出NoSuchMethodException。
解决方案
1. 添加反射配置文件
创建src/main/resources/META-INF/native-image/reflect-config.json文件,内容如下:
[ { "name": "sun.invoke.util.ValueConversions", "methods": [ { "name": "booleanToInt", "parameterTypes": ["boolean"] } ] } ]
该文件会告诉GraalVM在构建原生镜像时,为指定类和方法生成反射元数据。
2. 确保配置文件被打包进Jar
如果使用Maven,在pom.xml的<build>节点下添加资源配置,确保META-INF目录下的文件被正确打包:
<resources> <resource> <directory>src/main/resources</directory> <includes> <include>META-INF/**/*</include> </includes> </resource> </resources>
3. 构建原生镜像
方式一:直接使用native-image命令
native-image -jar your-application.jar -H:ReflectionConfigurationFiles=src/main/resources/META-INF/native-image/reflect-config.json
方式二:使用Maven原生镜像插件
在pom.xml中配置native-maven-plugin,自动集成反射配置:
<plugins> <plugin> <groupId>org.graalvm.buildtools</groupId> <artifactId>native-maven-plugin</artifactId> <version>0.9.28</version> <executions> <execution> <id>build-native</id> <goals> <goal>build</goal> </goals> <phase>package</phase> </execution> </executions> <configuration> <imageName>your-app</imageName> <buildArgs> <buildArg>-H:ReflectionConfigurationFiles=${project.build.outputDirectory}/META-INF/native-image/reflect-config.json</buildArg> </buildArgs> </configuration> </plugin> </plugins>
执行mvn package即可自动构建包含反射元数据的原生镜像。
4. 验证JNA版本兼容性
确保使用的JNA版本与GraalVM 17兼容,建议升级到5.14.0及以上版本,旧版本可能存在原生镜像适配问题。
验证
构建完成后,运行生成的原生可执行文件,即可正常调用共享库的square方法并打印结果。
内容的提问来源于stack exchange,提问作者burhan-taskesen
相关产品推荐
相关产品推荐

