Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JNI-C++;DLL-';未满足链接错误:%1不是有效的Win32应用程序'; 我试图在我的实际代码中跳过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)_Java_C++_Windows_Dll_Java Native Interface - Fatal编程技术网

JNI-C++;DLL-';未满足链接错误:%1不是有效的Win32应用程序'; 我试图在我的实际代码中跳过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)

JNI-C++;DLL-';未满足链接错误:%1不是有效的Win32应用程序'; 我试图在我的实际代码中跳过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),java,c++,windows,dll,java-native-interface,Java,C++,Windows,Dll,Java Native Interface,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

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();
    }
}
javah生成的jnitest.h:

/* 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
/*不要编辑此文件-它是机器生成的*/
#包括
/*类net\u condorcraft110\u jnitest\u jnitest的标头*/
#如果NDEF包括网络、康多尔克拉夫特110
#定义(包含)(网络)(共有)(110)(测试)(测试)(测试)
#ifdef_uucplusplus
外部“C”{
#恩迪夫
/*
*类别:净康多尔克拉夫特110\u jnitest\u jnitest
*方法:加载插件
*签字:()五
*/
JNIEXPORT void JNICALL Java_net_condorcraft110_jnitest_jnitest_测试
(JNIEnv*,jclass);
#ifdef_uucplusplus
}
#恩迪夫
#恩迪夫
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;
}
使用名称空间std;
#包括
#包括
#包括“jnitest.h”
外部“C”JNIEXPORT void JNICALL Java_net_condorcraft110_jnitest_jnitest_测试(JNIEnv*env,jclass clazz)
{

对我来说,问题是我新添加的DLL依赖于我不知道的其他DLL。Windows很有帮助地在我的路径中找到了一个32位版本,但无法加载,因为我的应用程序是64位的

我使用了(有32位和64位版本,还有安腾…)来调试它。它的长短是确保你的DLL拉入的每个DLL也是64位的,你会更高兴

需要注意的一件事是,如果Windows发现一个名称正确的32位DLL,它将尝试加载它,进程监视器将看起来它正在成功读取它。请确保继续向下滚动!!您可能会发现系统丢弃此DLL并继续搜索64位版本的路径

更新:
还有两件事需要注意:

1) 旧的Dependency Walker可能看起来与它加载的DLL不匹配,例如,当您确实需要64位DLL时,它可能会首先找到一个32位匹配,然后告诉您存在CPU类型不匹配。只需获得新版本,此问题就会消失。感谢提供此信息


2) 加载DLL时,顺序很重要。我不知道我加载了两个DLL的顺序不正确,也无法找出它不起作用的原因。请先检查您是否加载了先决条件。:-

我也遇到了同样的问题。 我的问题是我的dll使用了一些64位的依赖dll。 我在dependency walker中打开了我的jni dll,在那里我找到了64位的dll,我用32位替换了它。
我的问题得到了解决。

我最初遇到了
找不到依赖库
的错误,我在路径中添加了DLL。但这导致了错误
%1在java上不是一个有效的Win32应用程序
。为了解决所有问题,使静态构建对我有效,它使用:
g++-static
编译。它在构建本身中删除依赖库。

你在这里解决过这个问题吗?我遇到了同样的问题,使用64位gcc和cygwin。@Philip我解决了这个问题。看看你的问题是否与我的类似。:-)我会在回到我的开发机器时尝试这个问题,但谢谢你回答这么老的问题!感兴趣吗g!我设法“解决”我的问题是完全切换到mingw而不是cygwin,但最好测试一下。我的理解是,cygwin编译的应用程序需要加载cygwin特定的DLL,而禁用此功能的gcc选项在版本4+中被忽略,仍然没有被添加回来。我想问题可能是解决到32位cygwin dLLs而不是64。依赖沃克帮了大忙!谢谢你的提示!
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;
}