------------------------------------------------------------------------------------------
学习: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