在Windows上使用JNI从Java调用Golang会导致“动态链接库(DLL)初始化例程失败”

I created the following example project to test out calling Golang code from Java using JNI: https://github.com/blaubaer/golang-jni

When I call build.cmd I receive an error message like this:

Exception in thread "main" java.lang.UnsatisfiedLinkError: [...]\out\hello.dll: A dynamic link library (DLL) initialization routine failed
        at java.base/java.lang.ClassLoader$NativeLibrary.load0(Native Method)
        at java.base/java.lang.ClassLoader$NativeLibrary.load(ClassLoader.java:2430)
        at java.base/java.lang.ClassLoader$NativeLibrary.loadLibrary(ClassLoader.java:2487)
        at java.base/java.lang.ClassLoader.loadLibrary0(ClassLoader.java:2684)
        at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2649)
        at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:829)
        at java.base/java.lang.System.loadLibrary(System.java:1867)
        at Hello.<clinit>(Hello.java:3)

Used environment:

  • Windows: 10.0.17763, Build 17763, 64bit
  • Golang: 1.11.5, windows/amd64
  • Java: 11.0.2 2019-01-15 LTS, 64-Bit
  • MinGW-w64: x86_64-8.1.0-win32-sjlj-rt_v6-rev0

Thanks!

dongxu8533486
dongxu8533486 谢谢大家的答复。再说一遍:我的目标是创建一个JNI包装器。所以我的问题仍然是:我该怎么做才能确保我的代码是Golang中的有效JNI代码?附件是项目的上方,修改它的任务是直到使用它为止-使用JNI而不是JNA。谢谢!
一年多之前 回复
duandi4815
duandi4815 您不能使用JNI调用任意库。您要么为此需要JNA,要么创建一个包装器库。另请参阅此处的我的答案stackoverflow.com/questions/52308121/…或此处stackoverflow.com/questions/52944462/…
一年多之前 回复
dpr77335
dpr77335 感谢您的输入。但是这些东西正在使用JNA,这不是我的问题。我需要JNI解决方案,因为出于我的目的JNA太慢了。
一年多之前 回复
dpg78570
dpg78570 另外:从其他语言调用Go函数
一年多之前 回复
doujunchi1238
doujunchi1238 请参阅如何从Java调用go函数?
一年多之前 回复

1个回答



它似乎与Golang本身的错误有关。 当前有一个“拉取请求”已打开运行时:此更改修改了Go以修复x64上的c共享dll崩溃 Windows#30944 ,在此我可以批准它解决此问题。</ p>
</ div>

展开原文

原文

It seems to be related to a bug inside Golang itself. There is currently a Pull Request opened runtime: This change modifies Go to fix c-shared dll crash on x64 windows #30944 where I can approve that this will fix the issue.

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问