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 选择+号 进行

java 调用动态库打包sdk的更多相关文章

  1. Java调用动态库方法说明-最详细

    Java不能直接调用由c或者c++写得dll(TF_ID.dll),所以只能采用jni得方法,一步一步生成符合规范得dll文件(假设叫FANGJIAN.dll),在FANGJIAN.dll这个文件里来 ...

  2. # 2017-2018-2 20155228 《信息安全系统设计原理》 使用VirtualStudio2008创建和调用静态库和使用VirtualC++6.0创建和调用动态库

    使用virtual c++ 6.0创建和调用动态库 不得不说一下关于环境的问题 只要我打一个响指,一半的安装在win7上的VC6.0都会因为兼容性问题直接崩掉 懒得研究怎么解决兼容性的问题了,直接开一 ...

  3. [转]linux 调用动态库so文件

    记录一个面试被问到的问题. extern 有什么用途? 除了多文件共享全局变量外还有呢? extern "C" 的功能? 我想看完这篇文章就可以知道第三个问题了. 关于动态调用动态 ...

  4. windows 创建和调用 动态库,静态库

    windows创建和调用静态库 // MathFuncsLib.h namespace MathFuncs { class MyMathFuncs { public: // Returns a + b ...

  5. c++调用动态库失败解决办法

    c++调用动态库失败解决办法 之前写好的程序今天早上过来发现在服务器上出错了,于是就各种查问题,整整一个早上外加下午两个小时都在查这个问题,最终被我找到了问题: 在程序中我发现LoadLibrary( ...

  6. C++---初识《通过g++ / makefile 编译和调用动态库so文件》(ubuntu)

    C++---初识<通过g++ / makefile  编译和调用动态库so文件>(ubuntu) ------------------------目录------------------- ...

  7. LoadLibraryA 和 GetProcAddress 调用动态库

    通过LoadLibraryA 和 GetProcAddress,动态调用无需配置链接库lib和相关的头文件配置.下面介绍一个例子的实现 1.动态库 A.加法类 头文件:#pragma once cla ...

  8. Qt生成和调用动态库dll,和静态库.a(windows和linux通用)

    系统1:ThinkPad T570.Windows10.QT5.12.2(Qt Creater 4.8.2)一.动态库.dll的创建和调用1.在qtcreater中按如下步骤创建动态库,动态库名为my ...

  9. java调用dll库

    1.dll叫动态链接库,作用是用某种语言封装好某些函数生成可供不同语言调用的.dll文件,通常是用C++编写生成,因为C++可以对很多硬件操作方便而其他高级语言不行 2.dll生成参考:http:// ...

随机推荐

  1. 1.windows环境搭建

    1.安装jdk JDK为开发用到,一般默认带有了jre;jre为运行时用到. 下载java se的jdk,https://www.oracle.com/technetwork/java/javase/ ...

  2. CSS布局之BFC和IFC

    本文为原创,转载请注明出处: cnzt       文章:cnzt-p http://www.cnblogs.com/zt-blog/p/6708358.html <这是一篇css2-3的布局规 ...

  3. SQL2008安装时,“provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接) (.Net SqlClient Data Provider)” 错误的解决方案

    错误提示: 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误.未找到或无法访问服务器.请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接. (provide ...

  4. kvm虚拟化学习笔记(三)之windows kvm虚拟机安装

    KVM虚拟化学习笔记系列文章列表----------------------------------------kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51 ...

  5. 架构师基本功:SOA

    (以下内容为个人理解,可能不够全面和准确) SOA (service-oriented architecture),面向服务的架构 啥是SOA?网上的解释,玄而又玄.俺说点人话,也许不准确,但现阶段我 ...

  6. UVA 437 The Tower of Babylon巴比伦塔

    题意:有n(n≤30)种立方体,每种有无穷多个.要求选一些立方体摞成一根尽量高的柱子(可以自行选择哪一条边作为高),使得每个立方体的底面长宽分别严格小于它下方立方体的底面长宽. 评测地址:http:/ ...

  7. UPDATE command denied DELETE

    可用磁盘空间不足 支持SELECT information_schema. TABLES

  8. (ros/moveit)cob_simulation報錯

    cob_simulation報錯 依照官網說明 http://wiki.ros.org/cob_bringup_sim 1. git clone https://github.com/ipa320/c ...

  9. mac下Android Studio干净卸载

    1.卸载Android Studio,在终端(terminal)执行以下命令: rm -Rf /Applications/Android\ Studio.app rm -Rf ~/Library/Pr ...

  10. Tju 4119. HDFS

    4119.   HDFS Time Limit: 5.0 Seconds   Memory Limit: 5000KTotal Runs: 225   Accepted Runs: 77 In HDF ...