JNI в Linux

30.04.2012
Иванов Аркадий

 

   

     Это мелкая заметка для себя, чтобы потом снова не искать ключи компилятора и правила создания native-кода:

  • Простейшая Java-программа, обращающаяся к JNI:
     class Hello {
            public native void helloWorld();
            static { System.loadLibrary("helloworld"); } // гружу разделяемую библиотеку. 
                                                                                // Файл библиотеки должен называться libhelloworld.so
            public static void main(String[] args){
                    new Hello().helloWorld();
            }
    }
     
  • Компилирую, получаю Hello.class   :
    javac Hello.java 

     
  • Создаю H-файл для native ''C''-программы, получаю Hello.h:
    javah -jni Hello

    Hello.h будет вот такой:

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class Hello */

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

    #ifdef __cplusplus
    }
    #endif
    #endif

  • Создаю программу на ''C'', которая будет печатать "Hello,world !"
    #include <jni.h>
    #include "Hello.h"

    JNIEXPORT void JNICALL Java_Hello_helloWorld (JNIEnv *env, jobject obj) {
        printf("Hello,world ! \n");
        return;
    }
     
  • Компилирую и создаю разделяемую библиотеку libhelloworld.so (JDK у меня находится в /usr/local/jdk) :
    g++ -I"/usr/local/jdk/include" -I"/usr/local/jdk/include/linux" -o libhelloworld.so -shared helloWorld.c

     
  • Запускаю программу, указывая Java-машине путь к библиотекам:
    java  -Djava.library.path=.  Hello