這個程式很早就開始寫了,但過程中遇到了太多小問題,磕磕絆絆的,到今天程式才算是跑起來。
1、寫Java來源程式
class HelloWorld { private native void print(); public static void main(String[] args) { new HelloWorld().print(); } static { System.loadLibrary("HelloWorld"); } }
本地函數是print,linux下,此庫檔案應該是libHelloWorld.so.
2、編譯並產生標頭檔
javac HelloWorld.javajavah HelloWorld
產生的標頭檔為:
/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class HelloWorld */#ifndef _Included_HelloWorld#define _Included_HelloWorld#ifdef __cplusplusextern "C" {#endif/* * Class: HelloWorld * Method: print * Signature: ()V */JNIEXPORT void JNICALL Java_HelloWorld_print (JNIEnv *, jobject);#ifdef __cplusplus}#endif#endif
3、C程式
#include <jni.h>#include <stdio.h>#include "HelloWorld.h"JNIEXPORT void JNICALL Java_HelloWorld_print(JNIEnv *env, jobject obj){printf("i am linc !!!\n");return;}
4、編寫make檔案(此檔案沒有尾碼,就叫makefile)
libHelloWorld.so:HelloWorld.ogcc -rdynamic -shared -o libHelloWorld.so HelloWorld.oHelloWorld.o:HelloWorld.c HelloWorld.hgcc -c HelloWorld.c -I./ -I/usr/java/jdk1.6.0_25/include -I/usr/java/jdk1.6.0_25/include/linux
5、運行makefile,只要在makefile目錄下,make斷行符號就ok啦
此時會產生libHelloWorld.so,按道理說,把此so檔案放在java.class檔案的目錄,就可以正常運行了。
但是我失敗了。
報錯:java.lang.UnsatisfiedLinkError: no HelloWorld in java.library.path
最後的解決方案是這樣,用如下
public class LibPath {public static void main(String args[]){ System.out.println("Linc"); System.out.println(System.getProperty("java.library.path")); } }
列印出lib目錄,我這用到了/usr/java/jdk1.6.0_25/jre/lib/i386/server
然後把so檔案放入其中,就ok了。
此間也遇到了沒有許可權的問題,我用root把此目錄的許可權給改了。
現在可以向下進行JNI的學習了!!!