6

嗨,我没有找到如何创建 64 位 dll 的解决方案。并使用它的本机 c++ 方法。我使用 Java 代码 metodynatywne.java :

class metodynatywne {

static {
  System.loadLibrary("metodynatywne");
 }
native public void sayHello();

public static void main (String argv[])
{
    new metodynatywne().sayHello();
}  }

然后使用 javah -jni metodynatywne 生成metodynatywne.h

我写了metodynatywne.cpp代码:

   #include <jni.h>
   #include <iostream>
   #include "metodynatywne.h"
   using namespace std;

   JNIEXPORT void JNICALL
   Java_metodynatywne_sayHello(JNIEnv * env, jobject self)
      {
cout << "Hello World!" << endl;
   }

我使用 gcc 使用命令创建我的 dll:

 c:\>c++ -I c:\java7\include -I c:\java7\include\win32 -c metodynatywne.cpp

   c:\>c++ -shared metodynatywne.o -o metodynatywne.dll

我得到的是错误消息:

c:\>java metodynatywne
Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\Programowanie\UJ\Semestr2\ZPG\PerfCount\cwiczenie\metodynatywne.dll: Can't lo
 ad IA 32-bit .dll on a AMD 64-bit platform
    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 metodynatywne.<clinit>(metodynatywne.java:4)

我使用了 Java 1.4 32 位 javac 编译器和 java7 x64 编译器,这两个方法都给了我同样的错误。我该如何处理?如果是,请使用另一个 c++ 编译器如何强制此编译器创建可供我的 java dll 文件使用的。我在 Windows 7 64 位上工作。

如何从 cpp 文件制作 64 位 dll(使用 gcc)?还是其他命令行编译器?

非常感谢您提供的任何评论和帮助。

4

3 回答 3

0

This compiler flag should help: c++ --64 -DARCH_X86_64=1 file.cpp

于 2013-11-21T15:46:47.370 回答
0

您应该为 64 位重新编译 DLL(您必须下载 64 位构建工具)。您也可以切换到 32 位 JVM(只需下载 32 位 JVM)。

于 2013-11-07T15:06:33.997 回答
0

在这个问题上仍然没有公认的答案,所以我会咬一口......正如 Denis 提到的,您需要下载一个 64 位编译器来生成您的 .dll。这些天来,大多数人在 Windows 上使用 MinGW-w64(http://www.mingw.org或直接在此处下载http://sourceforge.net/projects/mingw-w64/files/latest/download?source=files)它有一个相当不错的安装包。注意 - 如果您不使用安装包,则需要自行安装整个工具链。然后,您将使用这个 64 位编译器可执行文件(类似于“x86_64-w64-mingw32-g++”)而不是 32 位 gcc 来生成您的库。

正如您在上面提到的,您确实需要注意您使用的 java 版本,以确保它与您编译的 C++ 库的体系结构相匹配。这意味着 JNI 标头的 Javah 自动生成和调用它的 Java 运行时。

于 2015-12-08T16:01:59.227 回答