Ubuntu下使用JNI

------------------------------------------------------------------------------------------

学习:http://www.ibm.com/developerworks/cn/java/l-linux-jni/

Ubuntu Version:9.10

------------------------------------------------------------------------------------------

 

1. 定义一个Java类Hello:

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 所在路径,执行:

javah Hello

 

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

#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) 编译生成共享库:执行:

g++ -I/home/lib/jdk1.6.0_20/include -I/home/lib/jdk1.6.0_20/include/linux -fPIC -c Hello.cpp

    生成 Hello.o:

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

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

cp libhello.so.1.0 libhello.so

 

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

export LD_LIBRARY_PATH='pwd':$LD_LIBRARY_PATH

 

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

public class ToSay {

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

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

}

     运行:

java ToSay

     出现:

Hello,John
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值