这个程序很早就开始写了,但过程中遇到了太多小问题,磕磕绊绊的,到今天程序才算是跑起来。
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.java javah HelloWorld
生成的头文件为:
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class HelloWorld */ #ifndef _Included_HelloWorld #define _Included_HelloWorld #ifdef __cplusplus extern "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.o gcc -rdynamic -shared -o libHelloWorld.so HelloWorld.o HelloWorld.o:HelloWorld.c HelloWorld.h gcc -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的学习了!!!