首先看一下echo $JAVA_HOME和echo $CLASSPATH都是不是对的
/usr/lib/jvm/java-6-sun
/usr/lib/jvm/java-6-sun/jre/lib
然后我建立一个目录 ~/java/jni/helloworld
下面的工作都是在这里面完成的
vim HelloWorld.java
输入
1 class HelloWorld 2 { 3 public native void print(); 4 5 static{ 6 System.loadLibrary("HelloWorld"); 7 } 8 9 public static void main(String[] args) 10 { 11 new HelloWorld().print(); 12 } 13 }然后 javac HelloWorld.java
会生成 HelloWorld.class
然后 java -classpatch . HelloWorld
会生成 HelloWorld.h
这里不指定-classpath的话会报错
错误:无法访问 HelloWorld 未找到 HelloWorld 的类文件 javadoc: 错误 - 找不到类 HelloWorld。 Error: 未在命令行中指定任何类。请尝试使用 -help。
生成的 HelloWorld.h中的内容是
1 /* DO NOT EDIT THIS FILE - it is machine generated */ 2 #include <jni.h> 3 /* Header for class HelloWorld */ 4 5 #ifndef _Included_HelloWorld 6 #define _Included_HelloWorld 7 #ifdef __cplusplus 8 extern "C" { 9 #endif 10 /* 11 * Class: HelloWorld 12 * Method: print 13 * Signature: ()V 14 */ 15 JNIEXPORT void JNICALL Java_HelloWorld_print 16 (JNIEnv *, jobject); 17 18 #ifdef __cplusplus 19 } 20 #endif 21 #endif这里面注意到函数是Java_HelloWorld_print,这个函数就是在c文件中需要实现的了然后 vim HelloWorld.c
1 #include <jni.h> 2 #include <stdio.h> 3 #include "HelloWorld.h" 4 5 JNIEXPORT void JNICALL 6 Java_HelloWorld_print(JNIEnv *env, jobject obj) 7 { 8 printf("Hello World!\n"); 9 }
然后进行编译c文件为*.so的库cc -I/usr/lib/jvm/java-6-sun/include/linux -I/usr/lib/jvm/java-6-sun/include/ -fPIC -shared -o libHelloWorld.so HelloWorld.c
这是可以写到Makefile里的倒是,这里手动的指定了java需要包含的头文件的路径,主要时jni.h吧 这样生成了libHelloWorld.so的文件最后执行 java -cp . -Djava.library.path='.' HelloWorld这里指定了两个参数-cp就是classpath,-Djava.library.path就是库的路径,反正都是当前目录的成功执行会输出Hello World!
至此,大功告成! 写了一个java程序,调用了一个C文件里面的函数。so~~参考资料有http://www.ibm.com/developerworks/cn/java/l-linux-jni/
http://my.unix-center.net/~Simon_fu/?p=359
http://blog.knowsky.com/261204.htm