news 2026/8/13 15:44:54

GIS-gdal-java.lang.NoSuchMethodError

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
GIS-gdal-java.lang.NoSuchMethodError

背景概述

这段时间使用gdal的时候,出现了一个找不到方法的的问题,具体报错内容如下:

java.lang.NoSuchMethodError:'intorg.gdal.gdal.Dataset.FlushCache()' atit.geosolutions.imageio.gdalframework.GDALImageWriter.write(GDALImageWriter.java:357)

问题解决

通过定位,这个错误是Dataset报出来的,我们知道对GDAL的调用最终要走到native,具体方法定义下:

// Dataset 中的方法publicvoidFlushCache(){gdalJNI.Dataset_FlushCache(swigCPtr,this);}// native 方法publicfinalstaticnativevoidDataset_FlushCache(longjarg1,Datasetjarg1_);

我们可以看到,它最终是要去调用一个void的方法。由于我本地用的gdal是3.9.0

ldd /usr/lib/x86_64-linux-gnu/libgdalalljni.so|grepgdal# 结果为 libgdal.so.39 或 libgdal.so.3.9.x

在3.9的时候c++的方法FlushCache的返回值已经被修改了,返回的是一个int ,这样在调用的时候JVM 在链接 JNI 方法时发现签名不匹配,我需要的是一个void方法,找到的确实一个int,我没有int方法与之匹配,所以就爆出了上面这个错误。
这里可能存在一些误解,我们可能会认为难道不是应该报错java.lang.NoSuchMethodError: ‘void org.gdal.gdal.Dataset.FlushCache()’ 因为是这个方法找不到但是其实原因如下:

JVM在解析调用 Dataset.FlushCache() 时,严格依据调用方(GDALImageWriter.write)的字节码来查找被调用的方法。GDALImageWriter.write 方法在编译时,其字节码中记录的调用目标是 返回类型为int的 FlushCache 方法。

JVM在类 Dataset 中查找方法时,发现只有一个名为 FlushCache、返回类型为 void 的方法。

因为找不到字节码所要求的 int 返回类型的 FlushCache 方法,所以JVM抛出 NoSuchMethodError,并明确指出缺少的是 int 返回值版本。

因此,报错信息中的 int,其实反映的是调用者(GDALImageWriter.write)的预期,而非底层native库的直接“要求”。只不过在这个JNI场景下,这个预期恰好与更高版本的native库实现一致。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/13 15:44:50

探索Item-NBT-API的NBTChunk与NBTBlock:区块与方块数据存储技巧

探索Item-NBT-API的NBTChunk与NBTBlock:区块与方块数据存储技巧 【免费下载链接】Item-NBT-API Add custom NBT tags to Items/Tiles/Entities without NMS! 项目地址: https://gitcode.com/gh_mirrors/it/Item-NBT-API Item-NBT-API是一款强大的工具&#x…

作者头像 李华
网站建设 2026/8/13 15:39:02

从经济舱到头等舱:AI协作四层实战,重塑知识工作者生产力

最近一次出差,我坐在经济舱里,看着前排头等舱的乘客正对着笔记本屏幕,手指在键盘上快速敲击。他时而皱眉,时而微笑,屏幕上不是密密麻麻的代码,也不是复杂的报表,而是一个简洁的对话窗口。我大概…

作者头像 李华
网站建设 2026/8/13 15:38:32

从0开始开发NES游戏:使用dotNES构建经典贪吃蛇游戏

从0开始开发NES游戏:使用dotNES构建经典贪吃蛇游戏 【免费下载链接】dotnes .NET for the NES game console 项目地址: https://gitcode.com/gh_mirrors/do/dotnes dotNES是一个创新的开源项目,它允许开发者使用.NET框架为NES游戏机开发游戏。本教…

作者头像 李华
网站建设 2026/8/13 15:36:02

PentestGPT:如何用AI智能体框架重构传统渗透测试工作流

PentestGPT:如何用AI智能体框架重构传统渗透测试工作流 【免费下载链接】PentestGPT Automated Penetration Testing Agentic Framework Powered by Large Language Models 项目地址: https://gitcode.com/GitHub_Trending/pe/PentestGPT 想象一下&#xff0…

作者头像 李华