1. 定义一个Java类Hello:
- publicclassHello{
- //显式地加载本地代码库
- static{
- try{
- //此处即为本地方法所在链接库名
- System.loadLibrary("hello");
- }catch(UnsatisfiedLinkErrore){
- System.err.println("Cannotloadhellolibrary:\n"+e.toString());
- }
- }
- //声明的本地方法,必须指定native关键字
- publicnativevoidSayHello(StringstrName);
- }
2. 生成本地链接库
1) 生成本地接口头文件:切换到 Hello.class 所在路径,执行:
- javahHello
2) 在与 Hello.h 相同的路径下创建一个CPP文件 Hello.cpp, 该文件的内容如下:
- #include"Hello.h"
- #include<stdio.h>
- //与Hello.h中函数声明相同
- JNIEXPORTvoidJNICALLJava_Hello_SayHello(JNIEnv*env,jobjectarg,jstringinstring)
- {
- //从instring字符串取得指向字符串UTF编码的指针
- constjbyte*str=
- (constjbyte*)env->GetStringUTFChars(instring,JNI_FALSE);
- printf("Hello,%s\n",str);
- //通知虚拟机本地代码不再需要通过str访问Java字符串。
- env->ReleaseStringUTFChars(instring,(constchar*)str);
- return;
- }
3) 编译生成共享库:执行:
- g++-I/home/lib/jdk1.6.0_20/include-I/home/lib/jdk1.6.0_20/include/linux-fPIC-cHello.cpp
生成 Hello.o:
- g++-shared-Wl,-soname,libhello.so.l-olibhello.so.1.0Hello.o
注:这里与原文不同,需要使用g++而非gcc,关于g++与gcc的区别详见:http://blog.csdn.net/longxibendi/archive/2010/01/11/5177779.aspx
将生成的共享库拷贝为标准文件名:
- cplibhello.so.1.0libhello.so
4) 通知动态链接程序此共享文件的路径:
- exportLD_LIBRARY_PATH='pwd':$LD_LIBRARY_PATH
3. 编写一个Java测试类ToSay:
- publicclassToSay{
- publicstaticvoidmain(Stringargv[]){
- ToSaysay=newToSay();
- }
- publicToSay(){
- Helloh=newHello();
- //调用本地方法向John问好
- h.SayHello("John");
- }
- }
运行:
- javaToSay
出现:
- Hello,John
注意事项:
1.新建一个java Project ,直接在src下面建类,不要建包,进入到所建类的路径下 javah Hello