java sdk调用_java 调用动态库打包sdk

本文详细介绍了如何使用Java调用C++动态库,包括生成JNI头文件,多线程回调处理,Java主调函数与回调函数的实现,并提供了将项目打包成SDK供他人调用的方法。
摘要由CSDN通过智能技术生成

java连接c++动态库并生成jar包提供给别人调用

1、需要将java通过jni生成头文件,并导入到c++项目并对c++进行jni方法继承

在项目的src目录执行,否则会提示 错误:找不到符号

javac -encoding utf8 D:\project\DeviceDemo\src\com\javaCallDll\DemoController.java

javah -jni  com.javaCallDemo.DemoController

2、c++是多线程回调,需要将当前线程注册到虚拟机中用到AttachCurrentThread

void TabletRemoteContollerRbtAdapter::onDeviceMac(rbt_win_context* context, const char* pMac) {

JNIEnv* pEnv;

gs_jvm->AttachCurrentThread((void **)&pEnv, NULL);

if (!pEnv) {

std::cout << "pEnv == null" << std::endl;

return;

}

jclass jClassTmp = pEnv->GetObjectClass(_correspondJavaClassInstance);

_onDeviceMacMethodID = pEnv->GetMethodID(jClassTmp, "onDeviceMac", "(Ljava/lang/String;)V");

if (!_onDeviceMacMethodID) {

std::cout << "_onDeviceMacMethodID is nullptr" << std::endl;

return;

}

jstring jMac = CStrToJStr(pEnv, pMac);

pEnv->CallVoidMethod(_correspondJavaClassInstance, _onDeviceMacMethodID, jMac);

}

3、在java 写主调函数和回调函数在主调初始化的时候将回调类做为参数传进去

public static final TabletRemoteController tabletRemoteController = new TabletRemoteController();

/**

* 初始化接口

* @param rbtDataCallBack

* @return

*/

public int init(RbtDataCallBack rbtDataCallBack) {

tabletRemoteController.setRbtDataCallBack(rbtDataCallBack);

int res= tabletRemoteController.init();

return res;

}

public class TabletRemoteController {

static {

System.loadLibrary("device");

System.loadLibrary("ControllerAdapter");

}

private RbtDataCallBack rbtDataCallBack;

public void setRbtDataCallBack(RbtDataCallBack rbtDataCallBack) {

this.rbtDataCallBack = rbtDataCallBack;

}

public void onOriginData(String mac, int s, int x, int y, int p, byte[] buffer, int len) {

rbtDataCallBack.onOriginData(mac, s, x, y, p, buffer, len);

}

4、将c++动态库回调数据进行处理的可以继承回调类接口

public interface RbtDataCallBack {

void onOriginData(String mac, int s, int x, int y, int p, byte[] buffer, int len);

void onDeviceMac(String mac);

}

public class SampleCode {

public static void main(String[] args) {

RbtDeviceWifi rbtDeviceWifi = new RbtDeviceWifi();

rbtDeviceWifi.init(new RbtDataCallBack() {

@Override

public void onOriginData(String mac, int s, int x, int y, int p, byte[] buffer, int len) {

System.out.println("mac=" + mac + " s=" + s + " x=" + x + " y=" + y + " p=" + p + " byte=" + buffer + " len=" + len);

}

5、将项目进行打包并提供动态库给客户

打开project Structure 选择+号 进行

63f7d2c828412d17a54d424c1b84ca48.png

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值