2023-01-21 281
我试图在研究实际代码之前实际上使JNI工作,但是在我从C ++编译DLL并运行Java应用程序后,我会得到:
Exception in thread "main" java.lang.UnsatisfiedLinkError: <snip>\workspace\JNI test\native\jnitest.dll: %1 is not a valid Win32 application
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary1(Unknown Source)
at java.lang.ClassLoader.loadLibrary0(Unknown Source)
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at net.condorcraft110.jnitest.JNITest.main(JNITest.java:11)
用谷歌搜索了一下,我知道这通常是由于尝试使用32位JVM加载64位DLL引起的.但是,我的JVM是64位,如sun.arch.data.model等于64.
所证明
我的makefile:
CLASSPATH = ../bin
vpath %.class $(CLASSPATH)
all : jnitest.dll
jnitest.dll : jnitest.o
g++ -m64 -Wl,--add-stdcall-alias -shared -o $@ $<
jnitest.o : jnitest.cpp jnitest.h
g++ -m64 -I"C:\Program Files\Java\jdk1.7.0_51\include" -I"C:\Program Files\Java\jdk1.7.0_51\include\win32" -c $< -o $@
jnitest.h : net/condorcraft110/jnitest/JNITest.class
javah -verbose -classpath $(CLASSPATH) -o jnitest.h net.condorcraft110.jnitest.JNITest
clean :
rm jnitest.h jnitest.o jnitest.dll
jnitest.java:
package net.condorcraft110.jnitest;
public class JNITest
{
private static native void test();
public static void main(String[] args)
{
System.out.println("sun.arch.data.model = " + System.getProperty("sun.arch.data.model"));
System.loadLibrary("jnitest");
test();
}
}
jnitest.h javah生成:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class net_condorcraft110_jnitest_JNITest */
#ifndef _Included_net_condorcraft110_jnitest_JNITest
#define _Included_net_condorcraft110_jnitest_JNITest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: net_condorcraft110_jnitest_JNITest
* Method: loadPlugins
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_net_condorcraft110_jnitest_JNITest_test
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
jnitest.cpp:
using namespace std;
#include <jni.h>
#include <iostream>
#include "jnitest.h"
extern "C" JNIEXPORT void JNICALL Java_net_condorcraft110_jnitest_JNITest_test(JNIEnv *env, jclass clazz)
{
cout << "jni test successful" << endl;
}
有人知道为什么这不起作用吗?
编辑: java.library.path绝对指向native,如eclipse运行配置中的设置.
编辑2:如果我用VS2013编译DLL,但是我真的不想将我的项目与Visual Studio联系起来.
对我来说,问题是我新添加的DLL依靠我不知道的其他DLL. Windows有益地出去,在我的路径中找到了32位版本,但无法加载它,因为我的应用程序为64位.
我使用 depentency walker (有32和64位版本,以及Itanium … )和 Process Monitor 可以调试.长而短的是确保您的DLL所吸引的每个DLL也为64位,您会更快乐.
要注意的一件事是,如果Windows找到了将尝试加载它的正确名称的32位dll,并且在过程监视器中,它看起来像是成功地读取它.确保继续向下滚动!您可能会发现系统会丢弃此DLL并继续搜索64位版本的路径.
更新:
其他两件事要注意:
1)旧的依赖性步行者看起来像是它加载的DLL的不匹配,例如当您真的想要64位DLL并告诉您CPU类型不匹配时,它可能会首先找到32位匹配.只需获取新版本,这个问题就消失了.感谢 https://stackoverflow.com/a/a/22384936/309502 提供此信息.
2)加载DLL时订单很重要.我没有意识到我在错误的顺序上加载了其中两个,也无法弄清楚为什么它不起作用.检查您是否首先加载先决条件. : – )
i最初是出现Can’t find dependent libraries错误,以解决我在路径中添加dlls的问题.但这导致我遇到了错误%1 is not a valid Win32 application at java.为了解决所有问题,使静态构建对我有用,该版本与:g++ -static一起编译.它在构建本身中添加了依赖库.
我也遇到了同样的问题.
在我的情况下,问题是我的DLL正在服用大约64位依赖性DLL.
我将jni dll打开到依赖性沃克中,在那里找到了64位DLL.我用32位替换了它.
我的问题得到了解决.
以上所述是小编给大家介绍的JNI C++DLL-&39;未满足链接错误:%1不是有效的Win32应用程序#39;,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!
原文链接:https://77isp.com/post/26268.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态