JNI HellWorld 简单尝试

首先看一下echo $JAVA_HOME和echo $CLASSPATH都是不是对的

/usr/lib/jvm/java-6-sun

/usr/lib/jvm/java-6-sun/jre/lib

一开始我的CLASSPAH前面是//usr/.... 修改一下

然后我建立一个目录 ~/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







   

你可能感兴趣的:(JNI HellWorld 简单尝试)