初学Java JNI(javac , javah)

来源:互联网 发布:元数据和数据的区别 编辑:程序博客网 时间:2024/06/05 19:40

初学jni,一点心得...

编译环境eclipse, ubuntu

工程路径:   src/com/cqb/hellojnitest


package com.cqb.hellojnitest;


public class HelloJniTest {
   public native void displayHelloWorld();
   static{
  System.loadLibrary("hello");
   }
   public static void main(String[] args){
  new HelloJniTest().displayHelloWorld();
   }
}

1:进入src/ 目录,然后运行

       javac com/cqb/hellojnitest/HelloJniTest.java

       可以看到在相应的目录下生成了 HelloJniTest.class

    

       或直接在.java文件所在的目录底下 javac


2:  在src/目录下  及工程包名package com.cqb.hellojnitest所在的目录下

      javah com.cqb.hellojnitest.HelloJniTest 


3: 接下在src目录下编辑所需要到的.c文件  

 #include <jni.h>

#include <stdio.h>

#include "com_cqb_hellojnitest_HelloJniTest.h"

JNIEXPORT void JNICALL Java_com_cqb_hellojnitest_HelloJniTest_displayHelloWorld
  (JNIEnv *env, jobject obj)
{
  printf("HelloWorld JNI!\n");
  return;
}
   4: 编译.c生成.so文件   

gcc    -shared     -I     /home/congqingbin/developEnvironment/jdk1.6.0_31/include      -I     /home/congqingbin/developEnvironment/jdk1.6.0_31/include/linux     -I     /usr/include     com_cqb_hellojnitest_HelloJniTest.c          -o        libhello.so

    .so名字的生成规则   一定是 lib+"java代码中导入的库的名字"(此例中为hello)+.so

    -I参数是导入头文件,因为jni.h 和 jni_md.h不在默认的gcc头文件目录usr/include中

  5:运行java  com.cqb.hellojnitest.HelloJniTest会报错 

Exception in thread "main" java.lang.UnsatisfiedLinkError: no hello in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1738)
at java.lang.Runtime.loadLibrary0(Runtime.java:823)
at java.lang.System.loadLibrary(System.java:1028)
at com.cqb.hellojnitest.HelloJniTest.<clinit>(HelloJniTest.java:6)

     因为在默认的库路径找不到.so库    

     须导入库路径编译 java -Djava.library.path=. com.cqb.hellojnitest.HelloJniTest

     运行结果如下

     :~/workspace/JNIHelloTest/src$ java -Djava.library.path=. com.cqb.hellojnitest

      HelloJniTestHelloWorld JNI!


原创粉丝点击