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