如何在java中调用C的函数

近来,公司在做卡的一个项目上需要加密之类的,所以需要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 下

你可能感兴趣的:(java,c,函数,.so)