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

Я только сейчас вхожу в мир 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-метод создания общей библиотеки: "gcc -shared -Wl, -soname, libHelloWorld.so -o libHelloWorld.so HelloWorld.o"

Но когда я запускаю Java HelloWorld, он возвращает Aborted!

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

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


person hari    schedule 07.12.2011    source источник


Ответы (3)


На странице 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.

person Martin Dorey    schedule 30.11.2012

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

person Mohan    schedule 02.11.2017

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

person Lennart    schedule 07.12.2011
comment
На самом деле new HelloWorld().print() необходим, поскольку print() не статичен. - person Edward Thomson; 07.12.2011
comment
Вы правы, я думал об Android, где в этом нет необходимости, поскольку у вас нет main (). Отредактировал мой пост выше. - person Lennart; 07.12.2011