JNI C++DLL-&39;未满足链接错误:%1不是有效的Win32应用程序#39;

 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.

JNI C++DLL-&amp;39;未满足链接错误:%1不是有效的Win32应用程序#39;

所证明

我的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/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。