一个使用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的数,求最大值,最小值……

MAX96712在车载摄像头系统中的带宽分配与传输能力计算解析

在计算摄像头带宽与传输接口的关系时,需要考虑视频流的像素分辨率、帧率、颜色深度等因素。以 MAX96712 这种 GMSL2 产品为例,它支持每个链路在正向方向以 3Gbps 或 6Gbps 的固定速率工作。

weixin_43199439的博客 3324

qt下编译警告unused parameter 的取消

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

lanhy999的专栏 4440

基于PLC的立体车库控制系统设计

本文介绍了基于西门子S7-1511-1PN PLC和KTP700 Basic PN HMI的立体堆垛式停车场自动化控制系统。系统通过PLC逻辑控制滑台运动,配合传感器实现车辆存取自动化,包含初始化、入库、出库和安全保护程序。程序采用模块化设计,分为安全互锁、动画显示、模式切换等六个功能模块,运用边沿触发、定时器和多级联锁确保安全。HMI界面提供模式切换、车位选择、状态显示和手动控制功能。该系统具有模块化、安全性和可扩展性特点,可应用于多车位立体停车场场景。

sxs3030787796的博客 1262

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

互联网金融项目实战(大数据Hadoop hive)

什么是互联网金融? 互联网金融 --> 信贷(信用贷款) --> 支付宝率先搞了一个信用体系 互联网金融: 在线支付、P2P 银行: 只会锦上添画、不喜欢雪中送炭 银行害怕出现坏账 ( 储户存钱,银行放贷 赚个利息差 ) 银行是可以倒闭的 保险公司不允许倒闭 银行分为:商业银行(自生自灭的)和非商业银行(国家的) 中国工商银行 全球第一大行 招商银行(清朝的一个李鸿章) 中国银行(历史超过 100 年了) 国家政策:希望银行能够扶持中小型企业 p2p:网络借贷平台 民间吸纳贷款 -->

weixin_58276266的博客 1553

DEV-C++调试设置

       昨天用C/C++去考了CSP,结果用DEV-C++调试总是闪退,按照我的记忆打开了调试参数,迷迷糊糊搞了一通,还是没办法调试,难受了几个小时。所以今天痛下决心,一定要写下DEV-C++设置调试的过程,警示自己! 解决步骤 1.打开DevC++找到上方工具栏 2.点击选择编译选项,再按下图所示设置即可

懒羊羊的快乐小屋 1029

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

使用 Python 获取实时港股行情数据

在本教程中,你将学习如何通过 Infoway API 获取港股实时行情数据,具体以腾讯控股(0700.HK)和汇丰控股(0005.HK)为例,使用 Python 进行数据请求和解析。

kk_stoper的博客 1515

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

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

bcghgfr的博客 198

【Allegro学习笔记】常规标贴封装创建-0402封装创建实例

摘要 本文主要介绍如何使用Allegro制作表面贴装封装。 所使用的软件 使用Allegro制作常规贴片封装主要使用的软件有Pad Designer和Allegro 1 0402类封装制作 1.1 0402类封装焊盘分析 0402封装尺寸图如图1...

Honglong 1万+

【OpenClaw从入门到精通】第04篇:Web/TUI/钉钉全打通!OpenClaw多端交互实测指南(2026避坑版)

本文详解OpenClaw三大交互方式(Web控制台、TUI终端、钉钉集成),解决新手多端操作难题。Web控制台适合可视化深度配置,TUI终端满足服务器高效运维,钉钉集成实现移动办公协同。提供2026实测配置步骤、代码示例及避坑指南,涵盖设备配对、终端命令优化、聊天机器人回调验证等核心场景,助用户快速掌握"随时召唤AI助理"的全链路方案。 关键词 OpenClaw、多端交互、Web控制台、TUI终端、钉钉集成、AI助理、实操指南 核心亮点 全链路打通:覆盖Web/TIM/IM三端配置

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 3543

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

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

m0_54057522的博客 974

基于Jeecgboot3.9.0的flowable7.2.0流程增加一个OA请假单功能例子(二)

基于Jeecgboot3.9.0的flowable7.2.0流程增加一个OA请假单功能例子(二)

宁波阿成的博客 198

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

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

m0_54057522的博客 455

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

lwip-2.0.3

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

函数参数未使用警告去除 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

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

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

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

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【学习笔记】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、付费专栏及课程。

余额充值