Использование Java / JNI на Cygwin - PullRequest
       31

Использование Java / JNI на Cygwin

1 голос
/ 07 декабря 2011

Я сейчас вхожу в мир Java.Я сталкиваюсь с проблемой, когда пытаюсь скомпилировать пример программы для вызова C из Java.

Я хотел попробовать пример кода для JNI (который приведен в JNI.PDF от SUN-Micro).

Код выглядит примерно так:

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

Я скомпилировал с помощью javac HelloWorld.java и после этого получил .H файл для программы на C, используя "javah -jni HelloWorld"

Даже мой код на 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;
}

Я создал .dll в Cygwin, используя "gcc -Wl, - add-stdcall-alias -shared -o HelloWorld.dll HelloWorld.c"

Даже я использовал обычный Linux-метод создания Shared Lib:" gcc -shared -Wl, -soname, libHelloWorld.so -o libHelloWorld.so HelloWorld.o "

Но когда я запускаюjava HelloWorld, возвращаемое значение Прервано!

Поскольку я не очень разбираюсь в Java, я не уверен, где я ошибаюсь.

Я проверил похожий код, присутствующий на нескольких сайтах, таких как: http://www.inonit.com/cygwin/jni/helloWorld/, но получил похожую ошибку.

Ответы [ 3 ]

1 голос
/ 30 ноября 2012

На странице InOnIt используется -mno-cygwin.Если вам нужна функциональность Cygwin, то вам нужно переместить http://elliotth.blogspot.com/2005/08/porting-jni-code-to-win32-with-cygwin.html. Terminator с момента его написания.Суть источника, который вам нужен для безопасного запуска Cygwin Java, теперь составляет https://github.com/software-jessies-org/jessies/blob/master/salma-hayek/native/all/java-launcher/java-launcher.cpp.

1 голос
/ 02 ноября 2017

Я не смог заставить JNI работать с Cygwin's g++ - это вызывает зависимость от cygwin1.dll, которая конфликтует с JNI mechanism, вызывая сбой. -mno-cygwin flag больше не поддерживается. Но использование /bin/x86_64-w64-mingw32-g++.exe устранило проблему для меня.

0 голосов
/ 07 декабря 2011

Убедитесь, что ваша нативная библиотека действительно загружена, добавив блок try / catch вокруг вызова System.loadLibrary(), чтобы перехватить исключение UnsatifiedLinkError, если вашу библиотеку не удалось найти. Если это не сработает, опубликуйте вашу ошибку, «возвращение прервано» не очень полезно. Кроме того, вы определили собственный метод печати с возвращаемым типом void, но у вас есть оператор return. Либо удалите это, либо позвольте методу действительно что-то вернуть.

...