如何在java中调用C的函数

来源:互联网 发布:缎面 婚纱 知乎 编辑:程序博客网 时间:2024/05/17 01:36

近来,公司在做卡的一个项目上需要加密之类的,所以需要java中调用c的函数,所以才研究了一下,参考了网上一些例子,自己也试了试,给出例子如下:

java 类 

package com.lzg;
public class Test {    static {        System.loadLibrary("swdes");    }    public native static String GenCvv(String psCardNo, String psExpiry, String psServiceCode);    /**     *      * @param args     * @author lzg     * @time 2013-3-29 下午3:57:26     */    public static void main(String[] args) {        // TODO Auto-generated method stub        GenCvv("123", "1312", "1234");    }}


然后需要编译为class

javac Test.java
然后编译为.h文件

javah -classpath 工程的class路径 com.lzg.Test

然后就可以得到.h文件,你需要将.h文件交给c的同学,他们进行开发,然后生成出来.so或者.dll文件,你放入到java 中进行调用


c的同事给.so文件给我后,我放到linux环境下进行测试,碰到了两个问题目前都已经解决,而且可以正常调用,给大家分享一下,

上面提到如果类带包名的话,执行的时候需要注意

1 需要将编译好的class放在包中,比如我执行时是将Test.class 放在com文件夹下的lzg 里面,在com的包外面执行java com.lzg.Test 命令进行执行的

2 加载.so 文件时 ,我的c同事给我的.so 文件名为libswdes.so 我在java类里面调用时 需要这样写System.loadLibrary("swdes"); 不能带前面的lib和后缀名.so

3 需要将.so 放入到你的linux 下的jdk的安装目录下的 $JAVAHOME/jre/lib/i386  下

4 我在调用时碰到了一个jni wrong ELF class: ELFCLASS64 错误,不过顺利解决了由于同事编译.so时用了64位,而我的jdk是32位,解决办法是在编译.so 时指定位数 -m32(该步骤参考 http://blog.chinaunix.net/uid-21335514-id-3286281.html)

补充:windows环境下.dll文件要放到  $JAVAHOME\jre\bin 下

原创粉丝点击