使用 Java 本机接口时出错
Error using Java Native Interface
我正在尝试开发一个使用c ++代码的java程序。为此,我使用了 32 位 mingw、32 位 jre(版本 1.8.0_77)和 eclipse luna(64 位)。
问题所在
我在尝试加载 *.dll 时遇到问题。(我还没有尝试运行任何方法)
我测试过什么
这是我声明本机方法的类:
public class JniImports {
static{
System.loadLibrary("hello");
}
public int test(int n){
return testJava(n);
}
private native int testJava(int n);
}
这是主要方法:
public class Main {
public static void main(String[] args) {
JniImports a = new JniImports();
}
}
我已经配置了日食 JVM 的参数,并添加了以下内容:-Djava.library.path=./jni
c-head文件是由javah
工具生成的,所以我确定没问题。无论如何,正如我所说,我没有尝试执行任何方法。这里是头文件:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_jnitest_JniImports */
#ifndef _Included_com_jnitest_JniImports
#define _Included_com_jnitest_JniImports
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_jnitest_JniImports
* Method: testJava
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_com_jnitest_JniImports_testJava
(JNIEnv *, jobject, jint);
#ifdef __cplusplus
}
#endif
#endif
这里是 cpp 文件:
#include "com_jnitest_JniImports.h"
JNIEXPORT jint JNICALL Java_com_jnitest_JniImports_testJava
(JNIEnv *env, jobject _this, jint n){
return 12;
}
这是我用来编译的命令(g++ 是 mingw 32 位): g++ -Wl,--add-stdcall-alias -I"%JDK32_HOME%include" -I"%JDK32_HOME%includewin32" -shared -o hello.dll com_jnitest_JniImports.cpp
错误
如果我使用 64 位 JRE,错误是它无法在 64 位 JRE 上加载 32 位 dll:
java.lang.UnsatisfiedLinkError: D:wstestjnijnihello.dll Can't load IA 32-bit .dll on a AMD 64-bit platform
我认为此错误表明,在这种情况下,JRE 找到了 *.dll。
如果我使用 32 位 JRE,错误是它找不到 *.dll:
java.lang.UnsatisfiedLinkError: D:wstestjnijnihello.dll: Can't find dependent libraries
如果我使用 32 位 JRE 并删除 hello.dll 库,则错误如下: java.lang.UnsatisfiedLinkError: no hello in java.library.path
因此,使用 32 位编译器编译 c++ 代码并使用 32 位 JRE,它可以找到 dll,但无论如何它都会崩溃。
我还尝试在调试模式下编译 c++ 代码(使用 -g 标志),但它也会崩溃。
我确定 dll 在正确的位置,因为如果我复制粘贴窗口资源管理器路径栏中错误日志中显示的路径,它会将我带到 dll 所在的文件夹,并且我确定它的名称是"hello.dll"。
我已经用最新版本的 eclipse(32 位)对其进行了测试,它可以工作。我不知道这是一个日食错误,还是问题在于我使用的是 64 位日食,现在我使用的是 32 位日食。
- 访问者访问变体并返回不同类型时出错
- 在Linux for Windows上编译C++代码时出错
- 读取文件的最后一行并输入到链接列表时出错
- 重载操作程序时出错>>用于类中的字符串 memebr
- 调用专用模板时出错"no matching function for call to [...]"
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- LINK 尝试使用 OpenSSL evp aes 256 c++ 时出错
- 在Google Kick start中提交时出错
- 在c++中访问int到类对象的映射时出错
- 分段错误当我试图运行程序时出错
- 使用dynamic_cast和构造函数时出错
- CHECK(调用)函数在Google Colab中出错
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 用pybind11包装C++抽象类时出错
- Visual C++GC接口如何启用它以及要包含哪个库
- 为x86而非x64编译时出错
- Windows.h与GLFW.h的接口
- 从R调用C++函数并对其进行集成时出错
- 为重写std::exception的库生成swig接口时出错
- 使用 Java 本机接口时出错