java 调用动态库打包sdk
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的更多相关文章
- Java调用动态库方法说明-最详细
Java不能直接调用由c或者c++写得dll(TF_ID.dll),所以只能采用jni得方法,一步一步生成符合规范得dll文件(假设叫FANGJIAN.dll),在FANGJIAN.dll这个文件里来 ...
- # 2017-2018-2 20155228 《信息安全系统设计原理》 使用VirtualStudio2008创建和调用静态库和使用VirtualC++6.0创建和调用动态库
使用virtual c++ 6.0创建和调用动态库 不得不说一下关于环境的问题 只要我打一个响指,一半的安装在win7上的VC6.0都会因为兼容性问题直接崩掉 懒得研究怎么解决兼容性的问题了,直接开一 ...
- [转]linux 调用动态库so文件
记录一个面试被问到的问题. extern 有什么用途? 除了多文件共享全局变量外还有呢? extern "C" 的功能? 我想看完这篇文章就可以知道第三个问题了. 关于动态调用动态 ...
- windows 创建和调用 动态库,静态库
windows创建和调用静态库 // MathFuncsLib.h namespace MathFuncs { class MyMathFuncs { public: // Returns a + b ...
- c++调用动态库失败解决办法
c++调用动态库失败解决办法 之前写好的程序今天早上过来发现在服务器上出错了,于是就各种查问题,整整一个早上外加下午两个小时都在查这个问题,最终被我找到了问题: 在程序中我发现LoadLibrary( ...
- C++---初识《通过g++ / makefile 编译和调用动态库so文件》(ubuntu)
C++---初识<通过g++ / makefile 编译和调用动态库so文件>(ubuntu) ------------------------目录------------------- ...
- LoadLibraryA 和 GetProcAddress 调用动态库
通过LoadLibraryA 和 GetProcAddress,动态调用无需配置链接库lib和相关的头文件配置.下面介绍一个例子的实现 1.动态库 A.加法类 头文件:#pragma once cla ...
- Qt生成和调用动态库dll,和静态库.a(windows和linux通用)
系统1:ThinkPad T570.Windows10.QT5.12.2(Qt Creater 4.8.2)一.动态库.dll的创建和调用1.在qtcreater中按如下步骤创建动态库,动态库名为my ...
- java调用dll库
1.dll叫动态链接库,作用是用某种语言封装好某些函数生成可供不同语言调用的.dll文件,通常是用C++编写生成,因为C++可以对很多硬件操作方便而其他高级语言不行 2.dll生成参考:http:// ...
随机推荐
- Meteor第一个应用程序
这一个小教程将教你如何建立你的第一个 Meteor 应用程序. 步骤 1 - 创建App 要创建应用程序,我们将从命令提示符窗口运行 meteor create 命令.该应用程序的名称是 meteor ...
- 利用NSA的MS17-010漏洞利用工具实现Win 7和Win Server 2008系统入侵
影子经纪人(Shadow Brokers)最近陆续曝光的NSA网络武器令人震惊,尽管这些工具是否出自国家级别黑客团队之手尚不清楚,但至少存在一个可以说明问题的事实:这些漏洞利用工具都能有效运行,且具有 ...
- [scrapy]实例:爬取jobbole页面
工程概览: 创建工程 scrapy startproject ArticleSpider 创建spider cd /ArticleSpider/spiders/ 新建jobbole.py # -*- ...
- ZOJ 3316 Game 一般图最大匹配带花树
一般图最大匹配带花树: 建图后,计算最大匹配数. 假设有一个联通块不是完美匹配,先手就能够走那个没被匹配到的点.后手不论怎么走,都必定走到一个被匹配的点上.先手就能够顺着这个交错路走下去,最后一定是后 ...
- 微信小程序 项目实战(三)list 列表页 及 item 详情页
1.项目结构 2.list 列表页 (1)数据(逻辑) list.js // pages/list/list.js Page({ /** * 页面的初始数据 */ data: { title: '加载 ...
- Redis 入门指南
就是DBIdx
- Android反复闹钟(每天)的实现
MainActivity例如以下: package cc.cc; import java.util.Calendar; import java.util.Locale; import android. ...
- 设计模式C++实现_2_简单工厂模式
简单工厂模式 主要用于创建对象. 新加入类时. 不会影响曾经的系统代码. 核心思想是用一个工厂来依据输入的条件产生不同的类,然后依据不同类的 virtual 函数得到不同的结果. 以下以苹果手机的生产 ...
- canvas鼠标点击划线
今天学习了canvas,打算写一个鼠标划线的效果. <!DOCTYPE html> <html lang="en"> <head> <me ...
- Cts框架解析(6)-任务的运行
前两篇讲了任务的加入和9大项配置,这篇讲任务的运行. 任务的运行 任务的运行在CommandScheduler的run方法中,所以删除全部的断点,在run方法中打上断点,重新启动启动debug: 先看 ...