【问题标题】:Using Java / JNI on Cygwin在 Cygwin 上使用 Java/JNI
【发布时间】:2012-01-14 20:16:27
【问题描述】:

我刚刚进入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;
}

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

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

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

由于我对 Java 没有太多了解,我不确定我哪里出错了。

我检查了几个网站中存在的类似代码,例如:http://www.inonit.com/cygwin/jni/helloWorld/,但得到了类似的错误。

【问题讨论】:

    标签: java-native-interface cygwin


    【解决方案1】:

    我无法让JNICygwin's g++ 一起工作——这会导致对cygwin1.dll 的依赖,这会与JNI mechanism 发生冲突,从而导致崩溃。不再支持-mno-cygwin flag。但是使用/bin/x86_64-w64-mingw32-g++.exe 为我解决了这个问题。

    【讨论】:

      【解决方案2】:

      InOnIt 页面使用 -mno-cygwin。如果您想要 Cygwin 功能,那么您需要 http://elliotth.blogspot.com/2005/08/porting-jni-code-to-win32-with-cygwin.html。终结者在写完之后就感动了。您想要的 Cygwin 安全 Java 启动器的关键源代码现在位于 https://github.com/software-jessies-org/jessies/blob/master/salma-hayek/native/all/java-launcher/java-launcher.cpp

      【讨论】:

        【解决方案3】:

        如果找不到您的库,请在 System.loadLibrary() 调用周围添加一个 try/catch 块,以捕获 UnsatifiedLinkError 异常,以确保您的本机库确实已加载。 如果这不起作用发布您的错误,“它返回中止”不是很有帮助。 此外,您使用 void 返回类型定义了本机打印方法,但您有一个 return 语句。要么删除它,要么让方法实际返回一些东西。

        【讨论】:

        • 其实new HelloWorld().print()是必须的,因为print()不是静态的。
        • 你说得对,我在想在 Android 中没有必要,因为你没有 main()。编辑了我上面的帖子。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-09
        • 1970-01-01
        • 2011-08-11
        相关资源
        最近更新 更多