Как скомпилировать динамическую библиотеку для приложения JNI в Linux?

Я использую Ubuntu 10.10

Вот что я сделал.

Hello.java :

class Hello {
        public native void sayHello();

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

        public static void main(String[] args){
                Hello h = new Hello();
                h.sayHello();
        }
}

Затем я выполнил следующие команды:

dierre@cox:~/Scrivania/provajni$ javac Hello.java

dierre@cox:~/Scrivania/provajni$ javah -jni Hello 

Я получил Hello.class и Hello.h .

Hello.h :

/* DO NOT EDIT THIS FILE - it is machine generated */
#include 
/* Header for class Hello */

#ifndef _Included_Hello
#define _Included_Hello
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Hello
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_Hello_sayHello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

Затем я создал Hello.cpp :

#include 
#include "Hello.h"
#include  

using namespace std;

JNIEXPORT void JNICALL Java_Hello_sayHello (JNIEnv *env, jobject obj) {
        cout << "Hello World!" << endl;
        return;
}

А теперь часть, в которой, как мне кажется, я облажался. Я был вдохновлен этим руководством ( Компиляция библиотеки динамических или общих объектов ) :

dierre@cox:~/Scrivania/provajni$ gcc -I"/usr/lib/jvm/java-6-sun/include" -I"/usr/lib/jvm/java-6-sun/include/linux" -o hellolib.so -shared -Wl,-soname,hello.so Hello.cpp -static -lc

, который генерирует файл hellolib. итак

Но когда я пытаюсь запустить его с помощью java Hello , у меня возникает такая ошибка:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no hellolib in java.library.path
 at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1734)
 at java.lang.Runtime.loadLibrary0(Runtime.java:823)
 at java.lang.System.loadLibrary(System.java:1028)
 at Hello.(Hello.java:4)
Could not find the main class: Hello.  Program will exit.

Я даже пробовал это:

  LD_LIBRARY_PATH=`pwd`
  export LD_LIBRARY_PATH

безрезультатно.

Я знаю, что что-то делаю чрезвычайно глупо, но я не могу понять, что это такое. Динамическая библиотека создается с параметром -shared, не так ли?

Обновление №1

Я пробовал static {System.load ("/ home / dierre / Scrivania / provajni / hellolib.so" ); } , чтобы проверить, сработало ли это, но теперь:

Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/dierre/Scrivania/provajni/hello.so: /home/dierre/Scrivania/provajni/hello.so: undefined symbol: _ZSt4cout
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1803)
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1699)
    at java.lang.Runtime.load0(Runtime.java:770)
    at java.lang.System.load(System.java:1003)
    at Hello.(Hello.java:4)

Обновление №2 Хорошо, чтобы решить проблему Update # 1 , мне, очевидно, пришлось использовать g ++ insted из gcc . Однако по-прежнему возникают проблемы с использованием метода load . Кажется, я не могу указать правильный путь.

38
задан dierre 17 October 2010 в 11:27
поделиться