如何在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 下
- 如何在java中调用C的函数
- 如何在C/C++语言中调用 sqlite 的函数
- 如何在IOS项目中调用C的函数
- 如何在C++中调用 C 函数?
- 如何在Swift中调用C函数
- 如何在C++中调用C函数
- 如何在C中调用C++函数 与 如何在C++中调用C的函数(待修改)
- 如何在C/C++中调用Java的方法
- 如何在C/C++中调用Java的方法
- 如何在C/C++中调用Java的方法
- 讲解如何在C/C++中调用Java的方法
- 在java中如何调用linux的ctrl+c指令?
- 如何在C/C++中调用Java
- 如何在C/C++中调用Java
- 如何在C/C++中调用Java
- 如何在C/C++中调用Java
- JNI中在被调用的C/C++函数中如何访问Java程序中的类,并编写应用实例
- 如何在c语言中调用一个函数,使其运行在NSRunLoop的线程中
- Super Jumping! Jumping! Jumping!
- 解决Sublime Text 2中文显示乱码问题
- Android开发 WebView使用注意事项
- 【烦人的小问题】自己各种遇到的问题,搜到答案就来这记录一份,也当做学习记忆
- 《渗透测试实践指南》读书笔记之漏洞利用
- 如何在java中调用C的函数
- javascript 动态添加表格
- hibernate 使用问题 2
- mysql 数据库中 int(3) 和 int(11) 有区别么???
- 一个比较好的命名管道例子
- poj 3321 Apple Tree
- cocos2d——开关按钮的使用(CCMenuItemToggle)
- 各种视频格式有什么区别
- 实体关系之@ManyToMany