分类: linux2012-05-22 09:12 1529人阅读 评论(0) 收藏 举报
下面是在ubuntu 下java jni调用C语言动态链接库的具体操作步骤。
1、创建一个Java程序(TestJNI.java)定义原生的c函数。
2、用javac编译TestJNI.java生成TestJNI.class。用javah带-jni参数编译TestJNI.class生成TestJNI.h文件,该文件中 定义了c的函数原型。在实现c函数的时候需要。
3、创建Hello.c,实现TestJNI.h定义的函数。
4、编译Hello.c生成libgoodlucky.so。
5、在java虚拟机运行java程序TestJNI。

1、Test.java 源文件

  1. public class TestJNI {
  2. static{
  3. System.loadLibrary("goodlucky");
  4. }
  5. public native void set(int value);
  6. public native int get();
  7. public static void main(String[] args) {
  8. TestJNI td=new TestJNI();
  9. td.set(10);
  10. System.out.println(td.get());
  11. }
  12. }
 
2、javac TestJNI.java
   javah -jni Test
   生成了TestJNI.h文件
   内容如下:
 
  1. /* DO NOT EDIT THIS FILE - it is machine generated */
  2. #include <jni.h>
  3. /* Header for class TestJNI */
  4. #ifndef _Included_TestJNI
  5. #define _Included_TestJNI
  6. #ifdef __cplusplus
  7. extern "C" {
  8. #endif
  9. /*
  10. * Class:     TestJNI
  11. * Method:    set
  12. * Signature: (I)V
  13. */
  14. JNIEXPORT void JNICALL Java_TestJNI_set
  15. (JNIEnv *, jobject, jint);
  16. /*
  17. * Class:     TestJNI
  18. * Method:    get
  19. * Signature: ()I
  20. */
  21. JNIEXPORT jint JNICALL Java_TestJNI_get
  22. (JNIEnv *, jobject);
  23. #ifdef __cplusplus
  24. }
  25. #endif
  26. #endif
 
3、 TestJNI.c,内容如下
 
  1. #include <stdio.h>
  2. #include "TestJNI.h"
  3. int i=0;
  4. JNIEXPORT void JNICALL Java_TestJNI_set
  5. (JNIEnv * env, jobject obj, jint j)
  6. {
  7. i=j;
  8. }
  9. JNIEXPORT jint JNICALL Java_TestJNI_get
  10. (JNIEnv * env, jobject obj)
  11. {
  12. return i;
  13. }
 
4、
    生成:对象文件TestJNI.o (注意,运行下面命令可能会报错,主要是gcc没有安装或者安装的不是那个版本,所以重新装一次就好了,命令:yum install gcc gcc-c++ gcc-g77)
        gcc -Wall -fPIC -c TestJNI.c -I./ -I/home/abc/jdk1.7/include -I/home/abc/jdk1.7/include/linux
        生成动态库libgoodlucky.so  注意这里的goodlucky 对应TestJNI.java中goodlucky。并且这里要以lib开头命名动态库.-Wall 显示错误和警告提示   -I(不是l,就是这个害死我了,汗)后面是 jni.h,jni_md.h的路径
        gcc -Wall -rdynamic -shared -o libgoodlucky.so TestJNI.o
    
      上面的两条命令等价于下面的命令:
        gcc -Wall -fPIC  -I./ -I/usr/java/jdk1.6.0_45/include -I/usr/java/jdk1.6.0_45/include/linux -shared -o libgoodlucky.so TestJNI.c
 
       另外一种:  (g++ Base64Coder.cpp  desMethod.cpp -fPIC -shared -o desAlgorithm.so )(目前还不可用)
        export CLASSPATH=$CLASSPATP:./jna.jar 
        g++ one.cpp two.cpp three.cpp -lstdc++ -fPIC -shared -o libtest.so
        export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${你的so目录}
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/you/libMyLibrary_jna.so
        编译器选项-fpic和链接器选项-shared
        
    注:编译C的语句:
    gcc -fpic -c test.c   (将C编译成o文件)
    gcc -shared -o libtest.so test.o (将o文件编译成so文件)
    
        修改.bash_profile文件,配置环境变量,由于生成的.so文件在当前目录下,故
 
        .bash_profile文件设置如下
        export LD_LIBRARY_PATH=./
        或者把生成的.so文件放到/usr/lib目录下也可以。
5、java TestJNI
//JNA导入jar包
export CLASSPATH=$CLASSPATP:./jna.jar 
 
 
进阶:
1、在第四步中,编写makefile文件
  内容如下:
 
  1. libgoodlucky.so:TestJNI.o makefile
  2. gcc -Wall -rdynamic -shared -o libgoodlucky.so TestJNI.o
  3. TestJNI.o:TestJNI.c TestJNI.h
  4. gcc -Wall -c TestJNI.c -I./ -I/home/abc/jdk1.7/include -I/home/abc/jdk1.7/include/linux
  5. cl:
  6. rm -rf *.o *.so

格式如下:
                一个 makefile 主要含有一系列的规则,如下:
                A: B
                (tab)<command>
                (tab)<command>
                
                每个命令行前都必须有tab符号。
具体可参考:http://goodcandle.cnblogs.com/archive/2006/03/30/278702.html
参考见:
http://watershitter.iteye.com/blog/477615#comments
http://lwjlaser.iteye.com/blog/779270
http://blog.csdn.net/kangkanglou/article/details/5807787

思考若是java文件带有包路径呢?可以去动手做做

linux下java调用C的更多相关文章

  1. linux下java调用.so文件的方法1: JNI

    摘自http://blog.163.com/squall_smile/blog/static/6034984020129296931793/ https://my.oschina.net/simabe ...

  2. linux下java调用.so动态库方法2: JNA

    摘自:http://blog.csdn.net/todorovchen/article/details/21319033 另请参见: http://blog.sina.com.cn/s/blog_8c ...

  3. windows和linux环境下java调用C++代码-JNI技术

    最近部门做安卓移动开发的需要调C++的代码,困难重重,最后任务交给了我,查找相关资料,没有一个教程能把不同环境(windows,linux)下怎么调用说明白的,自己在实现的过程中踩了几个坑,在这里总结 ...

  4. Linux下java nohup 后台运行关闭后进程停止的原因,不挂断后台运行命令

    Linux下java nohup 后台运行关闭后进程停止的原因,不挂断后台运行命令 今天写sh脚本发现一终止命令程序就停止运行了,检查了很久才发现后面少了个&字符导致的!错误写法:nohup ...

  5. Linux下java/bin目录下的命令集合

    Linux下JAVA命令(1.7.0_79) 命令 详解 参数列表 示例 重要程度 资料 appletviewer Java applet 浏览器.appletviewer 命令可在脱离万维网浏览器环 ...

  6. Linux下java进程CPU占用率高分析方法

    Linux下java进程CPU占用率高分析方法 在工作当中,肯定会遇到由代码所导致的高CPU耗用以及内存溢出的情况.这种情况发生时,我们怎么去找出原因并解决. 一般解决方法是通过top命令找出消耗资源 ...

  7. linux下Java环境的配置

    linux下Java环境的配置 现在用linux的朋友越来越多了,前几天就有两个朋友问我linux下怎么配置java环境,我想还有很多朋友想了解学习这方面的东西,就写一个完全一点的linux java ...

  8. JDK问题--linux下java unrecognized class file version错误的解决

    linux下java unrecognized class file version错误的解决 环境:RedHat Linux Enterprise 5.4 问题:java.sun.com下载jdk1 ...

  9. Windows下Java调用BAT批处理不弹出cmd窗口

    常规Windows下Java调用BAT方式肯定会弹出cmd窗口 Runtime.getRuntime().exec("cmd.exe /C start D:\\test.bat") ...

随机推荐

  1. 监控系统负载与CPU、内存、硬盘、登录用户数,超出警戒值则发邮件告警。

    zzx@zzx:~$ cat warning.sh #!/bin/bash #监控系统负载与CPU.内存.硬盘.登录用户数,超出警戒值则发邮件告警.    前提安装mail服务nh=`uname -r ...

  2. 应用架构的演进--MVC,RPC,SOA,微服务架构

    MVC架构:垂直应用架构 当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率. 当业务规模很小时,将所有功能都部署在同一个进程中,通过双机或者前置负载均衡 ...

  3. 设置MySQL客户端连接使用的字符集

    设置MySQL客户端连接使用的字符集 时间:2014-03-05    来源:服务器之家    投稿:root 考虑什么是一个"连接":它是连接服务器时所作的事情.客户端发送SQL ...

  4. python 设置系统/用户环境变量

    系统环境变量 winreg.HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment' 用户环境变 ...

  5. Tutorial: Create a Blinky ARM test project(创建一个闪灯的arm测试项目)

    Background ref : Tutorial: Create a Blinky ARM test project If you are new to ARM development, it is ...

  6. RNA组研究困难

    RNA组研究的困难何在?如果开发新技术来解决这些困难,您最想解决的科学问题是什么? RNA研究的困难在于研究技术落后 (1)从信息流来说,我们需要直接测定RNA的序列,但是我们只能DNA测序仪间接测得 ...

  7. iOS 内购相关

    iOS 内购相关 下面总结一下过往订阅和内购的项目的代码方面的实现细节和注意事项,特别是掉单方面的处理. 后台的协议.商品ID.银行卡.内购类型.沙盒账号测试人员都由运营或者产品在苹果后台中申请处理. ...

  8. Python 三十个实践、建议和技巧

    [导读]2020年,你又立了什么新的 Flag?新一年,我们先为大家准备 30 个非常优秀的 Python 实践技巧.希望这些诀窍能在实际工作中帮助大家,并且学到一些有用的知识. 1.使用 pytho ...

  9. Scanner方式输入小写字母转换成大写字母

    import java.util.Scanner; /**  * 小写字母转换成大写字母      * @author zzu119  *  */ public class letterTransfe ...

  10. Nginx安全优化

    一.隐藏版本号 http { server_tokens off; } 经常会有针对某个版本的nginx安全漏洞出现,隐藏nginx版本号就成了主要的安全优化手段之一,当然最重要的是及时升级修复漏洞. ...