一个使用sbt编译的JNI C++ 的模板

PySpark集成XGBoost实战:跨范式分布式训练全链路指南 XGBoost作为高性能梯度提升树模型,其单机设计与Spark分布式计算范式存在本质冲突——核心在于共享内存依赖、全局直方图构建与参数同步机制的不兼容。理解这一原理差异,是解决分布式训练OOM、特征维度错配、AllReduce超时等工程问题的前提。技术价值体现在真正支持千节点规模下的端到端可复现训练,完整保留XGBoost原生参数与正则能力;典型应用场景包括金融风控、电商推荐等需高精度AUC与可解释特征重要性的超大规模离线任务。本文聚焦xgboost4j-spark在PySpark生态中的落地实践,覆盖版本 阅读详情

如果你需要在Scala或是Java中调用C或C++函数库,就需要使用JNI, 这里就涉及到编译scala ,java 和C(C++)代码,在这里给出一个程序的框架,我们使用sbt 缺省的代码目录

文件目录
src
—>main
——–>java
——–>scala
——–>c

其中目录c存放C++代码 ,java目录放置Java代码, scala目录放置Scala代码

项目组用来编译的相关文件为build.sbt 和Makefile (它编译放置在c目录下的C++文件,注意只能编译C++,如果你有需要编译C,需要自行修改Makefile)

修改库文件名为自己所需的名称
修改build.sbt 中的项目名称

1name := "JNIDemo"
2 
3version := "0.0.1-SNAPSHOT"
4 
5organization := "com.guidebee"

修改Makefile的库文件名称

1#### PROJECT SETTINGS ####
2# The name of the executable to be created
3SODIR = target/so
4BIN_NAME= $(SODIR)/libjnidemo.so

修改Java引用的库文件名称:

1static {
2    System.loadLibrary("jnidemo");
3  }

设置环境变量
在你设置好sbt的编译环境后,注意设置 JAVA_HOME 和 LD_LIBRARY_PATH 环境变量 ,Java_HOME为你Java的安装目录, 可以使用
export LD_LIBRARY_PATH = $LD_LIBRARY_PATH:./:./target/so
将编译后的库文件添加到 java.library.path 路径中(这样Java代码可以找到库文件所在目录)

编译和运行
编译使用指令 sbt compile

1root@ubuntu:/sdb/jni# sbt compile
2[info] Set current project to JNIDemo (in build file:/mnt/sdb1/jni/)
3[info] Compiling 3 Java sources to /mnt/sdb1/jni/target/scala-2.10/classes...
4Creating directories
5Beginning release build
6Compiling: src/main/c/IntArray.cpp -> build/release/IntArray.o -Wall -Wextra -g -fPIC -c -O -m64 -Wunused-parameter
7src/main/c/IntArray.cpp:21:1: warning: unused parameter ‘obj’ [-Wunused-parameter]
8 Java_IntArray_sumArray(JNIEnv *env, jobject obj, jintArray arr)
9 ^
10         Compile time: 00:00:00
11Compiling: src/main/c/Prompt.cpp -> build/release/Prompt.o -Wall -Wextra -g -fPIC -c -O -m64 -Wunused-parameter
12src/main/c/Prompt.cpp: In function ‘_jstring* Java_Prompt_getLine(JNIEnv*, jobject, jstring)’:
13src/main/c/Prompt.cpp:24:13: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
14   char *buf="hello";
15             ^
16src/main/c/Prompt.cpp: At global scope:
17src/main/c/Prompt.cpp:22:1: warning: unused parameter ‘obj’ [-Wunused-parameter]
18 Java_Prompt_getLine(JNIEnv *env, jobject obj, jstring prompt)
19 ^
20         Compile time: 00:00:00
21mkdir target/so
22Linking: target/so/libjnidemo.so
23#@g++ build/release/IntArray.o build/release/Prompt.o  -fPIC    -o target/so/libjnidemo.so
24         Link time: 00:00:00
25Making library: target/so/libjnidemo.so -> target/so/libjnidemo.so
26Total build time: 00:00:00
27[success] Total time: 1 s, completed 29/08/2014 10:10:19 PM

运行
sbt run

1root@ubuntu:/sdb/jni# sbt run
2[info] Set current project to JNIDemo (in build file:/mnt/sdb1/jni/)
3[info] Running Test
4[info] User typed: hello
5[info] sum = 45
6[info] Type a line:
7[success] Total time: 0 s, completed 29/08/2014 10:10:54 PM

删除编译结果
sbt clean

1root@ubuntu:/sdb/jni# sbt clean
2[info] Set current project to JNIDemo (in build file:/mnt/sdb1/jni/)
3[info] Updating {file:/mnt/sdb1/jni/}jni...
4[info] Resolving org.fusesource.jansi#jansi;1.4 ...
5[info] Done updating.
6Deleting target/so/libjnidemo.so symlink
7Deleting directories
8[success] Total time: 1 s, completed 29/08/2014 10:11:35 PM

Github 代码
本例模板代码可以在 https://github.com/guidebee/JNIDemo下载。

20140829001

 
OpenCode与Copilot工作流配置:环境感知协议EAP实战指南 在AI编程工具落地实践中,'代码补全'只是表象,真正决定效能的是开发环境与大模型之间的上下文对齐能力。环境感知协议(EAP)作为OpenCode的核心机制,通过文件系统指纹、工具链探针和上下文注入三层结构,将项目元数据、本地工具版本、领域知识文档等隐性信息转化为模型可理解的结构化上下文。这一过程超越了传统插件配置逻辑,直指现代IDE智能增强的本质——即让AI‘读懂你的项目’而非仅‘猜你的代码’。其技术价值体现在跨语言支持、错误模式预判、重构安全边界等工程刚需场景,广泛适用于嵌入式开发、Java微服务、Pyt 阅读详情

相关推荐

SBT和AVL的C++模板实现

SBT和AVL的C++模板实现,提供了与stl中的set类似接口,支持迭代器,并提供了set所不支持的动态顺序统计功能,内含参考手册。

android 添加sdk自定义jni接口

1、创建一个文件夹jni_test(自定义) 存放位置:frameworks\base\jni_test 2、在jni_test目录下创建java目录和jni目录 jin目录下放入 *.cpp或*.c文件 #include <jni.h> #include <string> extern "C" { JNIEXPORT jint JNICALL Java_com_test_tai_NATEST_add(JNIEnv *env, jobject thiz, jint a, j..

a546036242的博客 1364

SBT和AVL的C++模板实现 最新版

SBT和AVL的C++模板实现,提供了与stl中的set类似接口,支持迭代器,并提供了set所不支持的动态顺序统计功能,内含参考手册。

C++怎么消除未使用变量的编译警告?warning: unused parameter ‘xxx’ [-Wunused-parameter](变量前加(void)声明为无用)

表示将该变量声明为无用的,这样编译器就不会再提示该变量未被使用的警告了。这种方法通常用于函数参数中有未使用的变量的情况,可以避免编译警告的干扰。在C++中,将变量名前加上。

Dontla的博客 1万+

SBT模板(平衡树)

本模板为 BZOJ3224:文艺平衡树 的源程序 含各种操作,旋转,插入,删除,求前驱,后继,查询值为x的数的排名,查询排名为k的数,求最大值,最小值……

Palantir解密:说人话,到底什么是“本体”?

笔者2018年在云计算公司开展政企数字化专项时,便意识到全面数字化进程背后存在大量未知领域,尤其是未来数字世界的底层架构如何构建这一关键问题。可惜因为种种原因,连那几个小专项最终都未能落地,也就无从深入了。近期看了很多有关Palantir的材料,倒觉得这像是新硅谷(区别于比尔盖茨、扎克伯格等主导的硅谷时代)交出的一份关于“数字世界底层架构”的答案,至于这个答案是否成立、有没有更优解、我们本土对标的版本是什么,可能都还待看。《Palantir解密》系列尝试通过解析Palantir,来系统回答这一问题。

SZSDQJC的博客 2154

qt下编译警告unused parameter 的取消

编译中出现以下警告: 警告:unused parameter 'nCurrSize' [-Wunused-parameter] 原因是由于函数参数未使用,这在程序当中有时候很正常;所以个人认为此警告意义不大,可以取消;   取消方法:   在pro工程文件最后加入如下代码: QMAKE_CXXFLAGS +=  -Wno-unused-parameter

lanhy999的专栏 4440

Cartographer全局重定位优化:无初始位姿约束的2万平工厂秒级定位实践

本文深入解析了Cartographer在2万平工业场景中的全局重定位优化实践,通过分支定界优化、子图动态加载和多传感器融合等关键技术,实现了无初始位姿约束下的秒级重定位。特别针对大场景下的快速重定位需求,优化后的系统在RK3588平台上表现出色,定位耗时从47秒降至1.8秒,成功率提升至91%,为工业自动化提供了高效解决方案。

rose2的博客 969

Size Balanced Tree(SBT) 类模板C++实现(持续更新)

Size Balanced Tree(SBT) 类模板C++实现(持续更新) http://blog.youkuaiyun.com/sprintfwater/article/details/8316268        Size Balanced Tree是OI神犇陈启峰发明的,据说是目前最高效的二叉查找树,搞了好长时间终于弄出来了~这个版本的SBT本来是打算用来实现STL的set

zdy0_2004的专栏 725

智能体在车联网中的应用:第9天 核心工具链与仿真世界:SUMO交通仿真入门——从安装到构建你的第一个虚拟十字路口

摘要 SUMO是一款开源微观交通仿真工具,为车联网和自动驾驶算法开发提供高效安全的测试环境。文章详细介绍了SUMO的核心概念、安装方法及实战应用。在Ubuntu或Windows系统安装SUMO后,可通过netedit工具构建十字路口路网,包括创建节点、连接边、设置交通信号灯等步骤。随后通过编写.rou.xml文件定义车辆类型、路线和车流,实现动态交通场景模拟。SUMO支持与外部程序交互,能复现真实场景、进行极端测试和算法验证,是车联网研究的理想数字沙盘。

IT深耕十余载,大道之简 1451

Comsol 管道导波裂纹检测:从建模到求解的完整流程解析

本文详细解析了使用Comsol Multiphysics进行管道导波裂纹检测的完整仿真流程。从几何建模、材料定义、物理场设置到网格划分与求解后处理,系统阐述了如何构建高保真虚拟模型以模拟导波与裂纹的相互作用。重点分享了激励信号设置、频散效应处理及参数化扫描等实战技巧,旨在帮助工程师与研究人员高效优化无损检测方案,降低实验成本。

weixin_29207439的博客 74

JNI详解:使用方法

jni全称java native interface,我把它分为三部分,java代表java语言,native代表当前程序运行的本地环境,一般指windows/linux,而这些操作系统都是通过C/C++实现的,所以native通常也指C/C++语言,interface代表java跟native两者之间的通信接口,jni可以实现java和C/C++通信。它是java生态的特征,所以定义在jdk标准当中。

a5566255的专栏 3670

基于Pixi.js的Live2D看板娘离线加载实战指南

本文详细介绍了基于Pixi.js实现Live2D看板娘离线加载的完整方案,涵盖环境搭建、模型加载、交互功能实现及常见问题解决。通过Pixi.js的硬件加速优势,开发者可在Web和Electron项目中无缝集成离线运行的Live2D模型,提升用户体验并避免网络依赖问题。

weixin_29001423的博客 343

一个使用sbt编译的JNI C 的模板

一个使用sbt编译的JNI C 的模板

bcghgfr的博客 198

021、反激变换器的软启动设计

本文分享了反激变换器软启动设计的实践经验。作者通过一次上电炸机事故引出软启动的重要性,分析了启动瞬间电流冲击和环路饱和问题。介绍了三种软启动方案:效果差的RC电路、推荐使用的数字芯片方案以及分立元件实现方法,重点指出数字方案的一致性优势。文章还探讨了软启动与过流保护的配合问题,提供了实测波形、温度影响等调试要点,并总结出软启动时间选择、批量生产一致性等实用建议。最后强调软启动是电源可靠性的关键设计,不应为节省成本而忽略。全文包含多个工程实践细节,对电源设计人员具有重要参考价值。(149字)

Jack010169的博客 174

黑猫带你学eMMC协议第14篇:eMMC FFU详解(Field Firmware Update)

1 前言 1.1 声明 本文依据eMMC JEDEC5.1及个人工作经验整理而成,如有错误请留言。 本文结合eMMC JEDEC5.1协议手册查看效果更佳。 1.2 内容提要 1、ffu相关寄存器有哪些? 2、如何设置ffu? 3、什么是ffu?是否能够更新旧版本的固件到emmc? 4、ffu配置流程图。 2 什么是FFU 主机下载新的固件到eMMC,下载成功后eMMC将固件安装到设备。 3 相关寄存器/命令 SUPPORTED_MODES [493] FFU_FEATURES [492] 该

黑猫奥利奥的博客 4657

Java 到 Native 的完整 JNI 链路实现模板,适用于 Android 系统源码开发场景(系统框架层注册)

以下是在 Android 系统源码系统框架层注册(如)中开发 JNI 的完整流程,涵盖从 Java 层到 Native 层的关键步骤及最佳实践。publicALOGEALOGIprintflogcatlibutils(在块中添加)在系统初始化代码中调用注册函数(如解释为什么在initinit.rczygote。

m0_54057522的博客 974

TC3XX - MCAL知识点(二十四):UART MCAL配置及代码实战

UART驱动程序负责按照UART协议提供通信服务。ASCLIN模块为异步通信提供硬件支持,实现UART协议。UART驱动程序提供了配置、初始化、数据传输、接收等功能,还提供了中止传输和中止接收 abort等可选特性。软硬件匹配关系如下:UART驱动程序使用ASCLIN进行数据的传输和接收。驱动程序使用的关键硬件功能特性是:1、全双工异步工作模式2、支持半双工工作模式3、16字节的TXFIFO4、16字节的RXFIFO5、2 ~ 16位数据帧6、校验位生成/检查7、一个或两个停止位。

梦想技术家 1831

Java 到 Native 的完整 JNI 链路实现模板,适用于 Android 系统源码开发场景(标准动态注册)

以下是一个从 Java 到 Native 的完整 JNI 链路实现模板,适用于 Android 系统源码开发场景(如修改。

m0_54057522的博客 455

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

函数参数未使用警告去除 unused parameter

在项目中出现这样的报错 crypto/wbc/m4ri.c: In function ‘mzd_mul_m4rm’: crypto/wbc/m4ri.c:286:67: error: unused parameter ‘k’ [-Werror=unused-parameter] 286 | mzd_t *mzd_mul_m4rm(mzd_t *C, mzd_t const *A, mzd_t const *B, int k) { 修改方法有以下两种 1 在函数参数中前添加__attribute__(

he979731102的博客 3796

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

JNI模板

java为了调用底层驱动函数,需要调用外部的C/C++代码,java提供了JNI接口: 然后将C代码编译成库(windows下 .dll / android环境下 .so) arm-linux-gcc -fPIC -shared hardcontrol.c -o libhardcontrol.so -I /usr/lib/jvm/java-1.7.0-openjdk-amd64/include...

weixin_30613343的博客 215

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【学习笔记】SBT学习笔记

[## 一、什么是SBT SBT , 即 Size Balanced Tree,是一种平衡二叉排序树,根据其节点中 Size 域大小进行平衡,由陈启峰于2006年在冬令营提出 二、为什么写SBT: 书写简单:在常用的平衡树( Spaly , Treap , AVL , Red-Black Tree ……)中,SBT的码量较小,只是在原有 BST 的基础上加入 Maintain 函数以及对Si...

weixin_30892037的博客 1148

Android JNI的C++模板不能访问基类定义的类型

template class CA { public: struct S_A { int a; }; }; template class CB:public CA { public: void Fun( S_A &refArg){}//;'S_A' has not been declared } 上面代码在VC中没有任何问题, 在安卓的JNI编译中,用N

brook0344的专栏 1900
上一篇: Akka 编程(20):容错处理(一)
下一篇: 构造Scala开发环境并创建ApiDemos示例项目
引路蜂
博客等级 码龄16年 3122粉丝 711原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值