分类: 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. markdown使用介绍

    一.标题,前面加#,加一个 一级标题,两个二级标题,以此类推. 一级标题 二级标题 三级标题

  2. IE8Get请求中文不兼容:encodeURI的使用

    IE8Get请求中文不兼容:encodeURI的使用 在开发过程中遇到在IE8下,请求出错. 后发现Get请求中含有中文字符. 使用js自带的encodeURI函数对中文进行编码,问题解决. enco ...

  3. [CQOI2016]K远点对(KD-Tree)

    暴力的做法应该是这样的,维护大小为k的堆,每次插入两点间距离并弹出堆顶. 然后这个做法显然是可以KD-Tree优化的,建立KD-Tree,然后如果该平面内最远点小于堆顶,则直接退出.就当做是复习很久没 ...

  4. mysql出现 too many connections

    出现这个问题的原因网上大致都是说这三种 1.慢sql 2.大量持久性的连接 3.程序没有及时关闭连接 解决方式 mysql -u 账号 -p 输入密码 show processlist; kill掉s ...

  5. SPOJ 247 chocolate (CHOCLO)

    题目http://www.spoj.com/problems/CHOCOLA/ 把一整块巧克力分成一个一个单元,掰断每一横行有个代价值,掰断每个纵行也有个代价值,要你求最后的总代价值最小 这个题目放在 ...

  6. pycharm实用技巧

    https://mp.weixin.qq.com/s/-48vU9KtnInFaYJ6rQ9n-w

  7. mysql比较运算,逻辑运算,范围查询,模糊查询

    比较运算 > < =  !=  <>   <=  >=  逻辑运算  and  or  not 范围查询  in   模糊查询  like             ...

  8. UML-设计对象时涉及的制品有哪些?

    1.SSD.系统操作.交互图--->用例实现 1).通信图 2).顺序图 将SSD中的系统操作作为领域层控制器对象的起始消息.这是关键. 2.用例--->用例实现 在整个开发过程中,业务人 ...

  9. 00java语法基础和课后实践

    一:运行代码,并分析结果 代码1: package reserve; public class Main { public static void main(String[] args) { Size ...

  10. 编译seastar

    1. 下载代码 git clone https://github.com/scylladb/seastar.git cd seastar git submodule update --init --r ...