最近项目需要使用JNI调用c++动态库,在网上找了些相资料大部分都是dll 的调用生成,so方面的比较少,不是很全所以刚刚测试通过就把自己的心得写下来了。

1.在项目包中定义自己和C++调用接口类;

2.将java编译好的class文件用javah -jni  打包成头文件.h

 

这里我的Class文件放在target\classes文件下,com.decard.util是我的包名,ControlInterface是我的类名运行生成后会在classes 生成一个com_decard_util_ControlInterface.h头文件;

3.编写C++动态库生成so或dll 文件,我的是Linux系统所以生成的是so文件,放在syslib路径下libControlInterface.so ;

4.编写动态库调用类代码如下:

public class ControlInterface {
static{
  System.loadLibrary("ControlInterface");
}
/**
 *
 * @param InUserData 用户输入环境数据
 * @param userID 用户ID
 * @return 返回字符串数据
 */
public native static String initConnection(String InUserData,String userID);
/**
 *
 * @param Date 业务操作数据
 * @param userID 用户ID
 * @return
 */
public native static String businessService(String Date,String userID);
/**
 *
 * @param IPAddress 用户访问IP地址
 * @param userID 用户ID
 * @return
 */
public native static void initAddress(String IPAddress,String userID);

注意编写的动态库调用类尽量使用生成头文件接口类,如果不想使用这个类可以new ControlInterface 的方式进行调用如:

public static Proce***esultBean infoConnection(String data,String userInfo){

   ControlInterface ci=new ControlInterface();

   String getback = ci.initConnection(data, userInfo);
   log.info("返回数据:"+getback);
   Proce***esultBean resultBean = new Proce***esultBean();
   resultBean.setData(getback);
   resultBean.setUserInfo(userInfo);
  return resultBean;
  }

因为我的接口和实现类不是同一个包所采用的new ControlInterface;