Сбой System.loadLibrary на Java 1.6, но работает на Java 1.5 - PullRequest
3 голосов
/ 14 июля 2011

Я столкнулся с особой проблемой в AIX 6.1 и SLES 11.Я пытаюсь загрузить файл so в Java с помощью вызова System.loadLibrary().Ниже приведен пример программы:

public class jniTest
{ 

  public static void main(String[] args)
  {

      try
      {
         System.loadLibrary("libSample.so");
         System.out.println("Loaded!!!");
      }
      catch(UnsatisfiedLinkError e)
      {
         System.out.println("unsatisfiedlinkerror");
      }
}  

Когда я компилирую этот фрагмент кода с Java 1.5, он работает правильно.Но когда я компилирую его с Java 1.6, он говорит UnsatisfiedLinkError.Я не понимаю, как я мог получить эту ошибку.Я запускаю так:

javac jniTest.java

java -Djava.library.path=. jniTest

Файл so находится в текущем каталоге, из которого я запускаю код.До этого я пытался:

  1. , указывающий абсолютный путь - не работал

  2. с использованием Runtime.getRuntime().loadLibrary() - не работал

Есть идеи, что я делаю не так?

Ответы [ 4 ]

2 голосов
/ 14 июля 2011

Я не думаю, что вы должны иметь расширение ".so" при использовании JNI.Попробуйте просто с System.loadLibrary("libSample");

0 голосов
/ 15 июля 2011

Другая возможность состоит в том, что ваши нативные функции в Java не совпадают с функциями в библиотеке. Существует очень четко определенное соглашение об именах для функций JNI. Например, если у вас есть функция в java, которая должна вызывать библиотечную функцию c / c ++:

package my.packagename;

public class Test {

    static {
        System.loadLibrary("Sample");
    }

    public native void testJNI(int arg1);
}

Соответствующая функция в c или c ++ ДОЛЖНА быть (при условии, что имя вашего пакета - "com.packagename"):

JNIEXPORT void JNICALL Java_my_packagename_Test_testJNI(JNIEnv* env, jobject obj, jint arg1) {
     // ... code here
}

Причина, по которой я прошел, заключается в том, что если имена функций не совпадают, выдается ошибка UnsatisfiedLinkError.

0 голосов
/ 14 июля 2011

Первые три вещи, о которых я думаю:

  1. Убедитесь, что библиотека находится на пути к Java-библиотеке (вы сделали это)
  2. Убедитесь, что вы используете System.loadLibrary() правильно.Если ваша библиотека называется "libSample.so", вызов должен быть System.loadLibrary("Sample").(Это было предложено в других ответах)
  3. Учтите, что может быть проблема с библиотекой в ​​OpenJDK, и вы используете виртуальную машину Java.Запустите команду java -version и, если часть ответа будет выглядеть как OpenJDK Runtime Environment (build 1.6.0_0-b11), попробуйте установить официальный Sun JDK и посмотрите, работает ли он.
0 голосов
/ 14 июля 2011

Просто чтобы расширить сказанное Джимом: вам не нужно расширение .so или часть файла lib.Это должно работать (по крайней мере, это работает для меня в 1.6):

  try
  {
     System.loadLibrary("Sample");
     System.out.println("Loaded!!!");
  }
  catch(UnsatisfiedLinkError e)
  {
     System.out.println("unsatisfiedlinkerror");
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...