初学Java JNI(javac , javah)

初学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!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值