java-native-interface - 在 Cygwin 上使用 Java/JNI

标签 java-native-interface cygwin

我刚刚进入Java世界。当我尝试编译从 Java 调用 C 的示例程序时,我遇到了问题。

我想尝试 JNI 的示例代码(在 SUN-Micro 的 JNI.PDF 中给出)。

代码是这样的:

class HelloWorld {
  private native void print();
  public static void main(String[] args) {
    new HelloWorld().print();
  }
  static {
    System.loadLibrary("HelloWorld");
  }
}

我使用 javac HelloWorld.java 进行编译,然后使用“javah -jni HelloWorld”获得 C 程序的 .H 文件

即使我的 C 代码也很简单:

#include <jni.h>
#include <stdio.h>
#include "HelloWorld.h"
JNIEXPORT void JNICALL
Java_HelloWorld_print(JNIEnv *env, jobject obj)
{
  printf("Hello World!\n");
  return;
}

我使用“gcc -Wl,--add-stdcall-alias -shared -o HelloWorld.dll HelloWorld.c”在 Cygwin 中创建了 .dll

即使我使用普通的 Linux 方法创建共享库:“gcc -shared -Wl,-soname,libHelloWorld.so -o libHelloWorld.so HelloWorld.o”

但是当我运行 java HelloWorld 时,它返回 Aborted!

由于我对 Java 不太了解,所以我不确定我哪里出错了。

我检查了一些网站中存在的类似代码,例如:http://www.inonit.com/cygwin/jni/helloWorld/但出现类似的错误。

最佳答案

我无法让 JNICygwin 的 g++ 一起使用——这会导致对 cygwin1.dll 的依赖,这与JNI机制,导致崩溃。不再支持 -mno-cygwin 标志。但使用 /bin/x86_64-w64-mingw32-g++.exe 为我解决了这个问题。

关于java-native-interface - 在 Cygwin 上使用 Java/JNI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8413290/

相关文章:

android - 在Android NDK下,是否可以在不调用Java来检索表面的情况下创建 native 窗口?

java - 如何使用 JNI 将 System.out 从 Java 传递到 C?

java - 不能将 java int 传递给 jni 函数

c# - 如何从 C# 执行 cygwin 命令并保持打开状态?

c++ - NetBeans6.9 C++ 运行时错误

java - 在哪里可以找到 Mac OS 的 jni 头文件

java - 在 Windows 上使用 JNA 加载自定义库

c - 如何在 Visual Studio 2015 中使用 fork()? (Windows 7 专业版)

python - 使用 Python boto 连接到 AWS 超时

git - 如何安装/设置 TortoiseGit 以与 GitHub 一起工作