Ubuntu下使用JNI




1. 定义一个Java类Hello:

Java代码 收藏代码
  1. publicclassHello{
  2. //显式地加载本地代码库
  3. static{
  4. try{
  5. //此处即为本地方法所在链接库名
  6. System.loadLibrary("hello");
  7. }catch(UnsatisfiedLinkErrore){
  8. System.err.println("Cannotloadhellolibrary:\n"+e.toString());
  9. }
  10. }
  11. //声明的本地方法,必须指定native关键字
  12. publicnativevoidSayHello(StringstrName);
  13. }
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. javahHello
javah Hello

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

Cpp代码 收藏代码
  1. #include"Hello.h"
  2. #include<stdio.h>
  3. //与Hello.h中函数声明相同
  4. JNIEXPORTvoidJNICALLJava_Hello_SayHello(JNIEnv*env,jobjectarg,jstringinstring)
  5. {
  6. //从instring字符串取得指向字符串UTF编码的指针
  7. constjbyte*str=
  8. (constjbyte*)env->GetStringUTFChars(instring,JNI_FALSE);
  9. printf("Hello,%s\n",str);
  10. //通知虚拟机本地代码不再需要通过str访问Java字符串。
  11. env->ReleaseStringUTFChars(instring,(constchar*)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-cHello.cpp
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-olibhello.so.1.0Hello.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

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

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

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

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

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

Java代码 收藏代码
  1. publicclassToSay{
  2. publicstaticvoidmain(Stringargv[]){
  3. ToSaysay=newToSay();
  4. }
  5. publicToSay(){
  6. Helloh=newHello();
  7. //调用本地方法向John问好
  8. h.SayHello("John");
  9. }
  10. }
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. javaToSay
java ToSay

出现:

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

注意事项:

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值