ubuntu下写jni文件为so文件

对于ubuntu下写jni文件为so文件,研究如下:

Java虽然强大,但对于面向底层的一些操作还是略显不足,此时唯有通过JNI来进行调用本地方法来扩展Java程序的功能。可以将native方法类比为Java中声明的接口方法,然后在外部用其他语言进行实现。

其实现步骤如下:

  1、在Java中声明native()方法,然后编译;

  2、用javah产生一个.h文件;

  3、写一个.c或.cpp文件实现native导出方法,其中需要include第二步产生的.h文件,另根据需要可以自己

              再include其他文件;

  4、将第三步的.c或.cpp文件编译成动态链接库文件(这个不同的系统下操作方法 不同);

  5、在Java中用System.loadLibrary()方法加载第四步产生的动态链接库文件,这个native()方法就可以在

              Java中被访问了。

   1.先编写一个Java文件,这里我保存为文件名Test.java

 

Java代码
  1. public class HelloWorld 
  2.     //此处定义的便是native方法  
  3.     native public void sayHello();  
  4.   
  5.     public static void main (String args[])         
  6.       (new HelloWorld()).sayHello();
  7.      
  8.     static{   
  9.         //这个作何用处下面的步骤会作说明  
  10.      System.loadLibrary ("HelloWorld");
  11.      
  12.  

 之后进行编译(javac)生成Test.class文件 (命令:javac Test.java)---注意:要带后缀名字。

2.通过javah -jni Test,会生成一个Test.h的头文件,其内容如下

Cpp代码如下:


#include <jni.h>


#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT void JNICALL Java_HelloWorld_sayHello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

3接着我再编写一个Test.c文件来进行

Java代码
  1. #include "jni.h"
    #include "HelloWorld.h"
    #include<stdio.h>

    JNIEXPORT void JNICALL Java_HelloWorld_sayHello (JNIEnv * env, jobject obj) {
       printf("Hello,the World!!!");
    }

4将Test.c编译成动态链接库,下面是其命令

Shell代码
  1. gcc -shared -fPIC -I/usr/lib/jvm/jdk1.6.0_34/include/ -I/usr/lib/jvm/jdk1.6.0_34/include/linux/ /home/xc/mapping/jni/HelloWorld.c -o libHelloWorld.so

解释一下上面的操作,当然我的系统是Ubuntu10.04,不过关于jdk安装之后的路径应该大同小异,自己做下适当的调整即可

/usr/lib/jvm/jdk1.6.0_34/include下包含的jni.h

/usr/lib/jvm/jdk1.6.0_34/include/linux下包含的是jni-md.h

-shared 是设置生成share object的标志

libHelloWorld.so即为我们需要的动态链接库(等同于Windows下的*.dll文件)。

5.可以再看Test.java中 System.loadLibrary("HelloWorld");的作用了,就是让其加载libtest而已。

顺便说明一下,用static声明的域不需要用try..catch来捕获异常,否则还是捕获一下为好。

OK,现在大功告成,让我们来运行该程序即可

Shell代码
java -Djava.library.path=. HelloWorld
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值