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