Ubuntu下使用JNI

12 篇文章 0 订阅

  


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. }  
public class Hello {

	// 显式地加载本地代码库
	static {
		try {
			// 此处即为本地方法所在链接库名
			System.loadLibrary("hello");
		} catch (UnsatisfiedLinkError e) {
			System.err.println("Cannot load hello library:\n" + e.toString());
		}
	}

	// 声明的本地方法, 必须指定 native 关键字
	public native void SayHello(String strName);

}

 

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

 

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. }  
public class ToSay {

	public static void main(String argv[]) {
		ToSay say = new ToSay();
	}

	public ToSay() {
		Hello h = new Hello();
		// 调用本地方法向John问好
		h.SayHello("John");
	}

}

     运行:

Cmd代码   收藏代码
  1. java ToSay  

     出现:

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

注意事项:

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值