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. Oracle计算时间差

    Oracle计算时间差表达式 --获取两时间的相差豪秒数 select ceil((To_date('2008-05-02 00:00:00' , 'yyyy-mm-dd hh24-mi-ss') - ...

  2. json数组原始字符串

    var a = '{"name":"1234"}';var c = '{["name":"张三","age&q ...

  3. Office EXCEL 中如何让一个单元格的数据链接到另一个工作表的数据

    比如我在Sheet2中定义了几个数据,这些都是简单的数字,而在Sheet1中让要被绑定的单元格等于Sheet2的对应单元格地址(比如Sheet2!B1,Sheet2!B2之类的)   然后就可以一改全 ...

  4. ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则

    ASP.NET MVC 学习笔记-7.自定义配置信息   ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...

  5. Cookie防伪造防修改 电商课题:cookie防篡改

    主要防止非法用户修改cookie信息,以及cookie的超时时间 传统cookie存储,Cookie(name, value),value很容易就被篡改. 防修改cookie存储,Cookie(nam ...

  6. java-组合优于继承

    组合和继承.都能实现对类的扩展. 差别例如以下表所看到的 组合 继承 has-a关系 is-a关系 执行期决定 编译期决定 不破坏封装,总体和局部松耦合 破坏封装,子类依赖父类 支持扩展,任意添加组合 ...

  7. 小胖说事35-----Terminating app due to uncaught exception &#39;CALayerInvalidGeometry&#39;, reason: &#39;CALayer posi

    2011-06-11 15:19:17.167 ***[930:707] *** Terminating app due to uncaught exception 'CALayerInvalidGe ...

  8. Saltstack运行cmd.run重新启动tomcat后出现日志乱码(15)

    Saltstack使用的cmd.run调用的是核心模块cmdmod.py,以下我们来看一下cmdmod.py模块的源代码: cat /usr/lib/python2.6/site-packages/s ...

  9. 【iOS系列】-iOS开发,GET,POST请求使用

    [iOS系列]-iOS开发,GET,POST请求使用 步骤: 1:实例化URL(网络资源) 2:根据URL建立URLRequest(网络请求) 默认为GET请求: 对于POST请求,需要创建请求的数据 ...

  10. #include &quot;*.c&quot;文件的妙用

    今天我在看代码的时候突然看到在一个.c文件里包括了#include "*.c"代码,这个让我非常诧异,然后google了一下.才发现是这么回事情.以下我写了一个測试代码.我相信你看 ...