Ubuntu下使用JNI

来源:互联网 发布:做程序员好吗 编辑:程序博客网 时间:2024/06/07 03:54

  


1. 定义一个Java类Hello:

Java代码  收藏代码
  1. public class Hello {  
  2.   
  3.     // 显式地加载本地代码库  
  4.     static {  
  5.         try {  
  6.             // 此处即为本地方法所在链接库名  
  7.             System.loadLibrary("hello");  
  8.         } catch (UnsatisfiedLinkError e) {  
  9.             System.err.println("Cannot load hello library:\n" + e.toString());  
  10.         }  
  11.     }  
  12.   
  13.     // 声明的本地方法, 必须指定 native 关键字  
  14.     public native void SayHello(String strName);  
  15.   
  16. }  

 

2. 生成本地链接库

1) 生成本地接口头文件:切换到 Hello.class 所在路径,执行:

Cmd代码  收藏代码
  1. javah Hello  

 

 2) 在与 Hello.h 相同的路径下创建一个CPP文件 Hello.cpp, 该文件的内容如下:

Cpp代码  收藏代码
  1. #include "Hello.h"  
  2. #include <stdio.h>  
  3. //与Hello.h中函数声明相同  
  4. JNIEXPORT void JNICALL Java_Hello_SayHello  (JNIEnv * env, jobject arg, jstring instring)  
  5. {  
  6.    //从instring字符串取得指向字符串UTF编码的指针  
  7. const jbyte *str =   
  8.         (const jbyte *)env->GetStringUTFChars( instring, JNI_FALSE );  
  9.     printf("Hello,%s\n",str);  
  10.     //通知虚拟机本地代码不再需要通过str访问Java字符串。  
  11.     env->ReleaseStringUTFChars( instring, (const char *)str );  
  12.     return;  
  13. }  

 

3) 编译生成共享库:执行:

Cmd代码  收藏代码
  1. g++ -I/home/lib/jdk1.6.0_20/include -I/home/lib/jdk1.6.0_20/include/linux -fPIC -c Hello.cpp  

    生成 Hello.o:

Cmd代码  收藏代码
  1. g++ -shared -Wl,-soname,libhello.so.l -o libhello.so.1.0 Hello.o  

    注:这里与原文不同,需要使用g++而非gcc,关于g++与gcc的区别详见:http://blog.csdn.net/longxibendi/archive/2010/01/11/5177779.aspx

    将生成的共享库拷贝为标准文件名:

Cmd代码  收藏代码
  1. cp libhello.so.1.0 libhello.so  

 

4) 通知动态链接程序此共享文件的路径:

Cmd代码  收藏代码
  1. export LD_LIBRARY_PATH='pwd':$LD_LIBRARY_PATH  

 

3. 编写一个Java测试类ToSay:

Java代码  收藏代码
  1. public class ToSay {  
  2.   
  3.     public static void main(String argv[]) {  
  4.         ToSay say = new ToSay();  
  5.     }  
  6.   
  7.     public ToSay() {  
  8.         Hello h = new Hello();  
  9.         // 调用本地方法向John问好  
  10.         h.SayHello("John");  
  11.     }  
  12.   
  13. }  

     运行:

Cmd代码  收藏代码
  1. java ToSay  

     出现:

Txt代码  收藏代码
  1. Hello,John 

注意事项:

   1.新建一个java Project  ,直接在src下面建类,不要建包,进入到所建类的路径下 javah Hello