一个JNI的Demo,linux上下载就可以用

最近用到了Java,需要用Java调用c++做的.so,搜了一下,有一个demo,但是这个demo有严重的问题。 加载.so的时候不好好地用 System.loadLibrary("hello");

他用System.load("hello");这个函数需要使用全路径。总是报这个错误:

Expecting an absolute path of the library:

真他么的。害人不浅。

这里我就做个demo,直接拿去用,就可以知道整个流程了。

如果不想太清楚也不要紧,用就行了。

谴责一个这个出来害人的博主。

JNI详解------完整Demo_java jni-CSDN博客

 

一、环境准备

ubuntu20.04

装jdk, 用default-jdk就可以。默认装的是jdk11

sudo apt install openjdk-11-jdk

sudo apt install default-jdk
$java -version
openjdk version "11.0.20.1" 2023-08-24
OpenJDK Runtime Environment (build 11.0.20.1+1-post-Ubuntu-0ubuntu120.04)
OpenJDK 64-Bit Server VM (build 11.0.20.1+1-post-Ubuntu-0ubuntu120.04, mixed mode, sharing)

gcc g++ 这些就不用说了,肯定也要的。

sudo apt install build-essential

二、下载代码

可以在这下载

https://download.csdn.net/download/v6543210/88475296

如果下载不了,就从下面的代码自己粘贴一下。

压缩包中的文件内容如下:

├── build.sh
├── demo
│   └── hello.java
├── demo_hello.cpp
├── demo_hello.h
└── Main.java

 demo是文件夹

demo/hello.java的内容

package demo;


public  class hello {
	{
		// 加载.so
		//System.setProperty("java.library.path", "./");
		//System.load("/home/demo/work/java/libhello.so"); //不要使用load,load需要全路径
		System.loadLibrary("hello"); //load  libhello.so
	}

	
	/**
	 * 就这个natice关键字.标记了这个接口,看起来像是abstract
	 */
	public native int sayHello(String msg);
}

 demo_hello.cpp的内容:

#include "demo_hello.h"
 
#include <iostream>
#include <string>


JNIEXPORT int JNICALL Java_demo_hello_sayHello(JNIEnv *env, jobject obj, jstring inJNIStr){
	const char *inCStr = env->GetStringUTFChars(inJNIStr, NULL);
    if (NULL == inCStr) return 1;

	using namespace std;
	cout << "Hello World"<< endl;
	cout << inCStr << endl;
	return 0;
} 

Main.java的内容:

import demo.*;


public  class Main {
	
	public static void main(String[] args) {
		new demo.hello().sayHello("java");
		
	}
}

三、编译运行过程

具体编译和运行的过程都写在build.sh中了,build.sh具体内容如下:

export JAVA_HOME=/usr/lib/jvm/default-java
javac -h . demo/hello.java

g++ -fPIC  -shared demo_hello.cpp  -o libhello.so  -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/linux" 

javac Main.java

export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH
java -Djava.library.path=. Main

现在的java 11里面没有javah这个命令了,取尔代之的是 javac -h命令

JAVA_HOME就用这个/usr/lib/jvm/default-java就挺好,省得去查版本号。

demo_hello.cpp这个文件的名字你可以自己定,demo_hello.h这个文件是 javac -h 命令生成的。

 

./build.sh运行后会在目录中生成libhello.so

运行程序时指定 java.library.path为当前目录,可以直接从当前目录加载libhello.so

java -Djava.library.path=. Main

运行java程序就可以看到输出结果:

jni$ ./build.sh
Hello World
java

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/104508.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

红路灯识别

1.截图图像中的目标对象 1.1 查找边界矩形 1.1.1直边界矩形 一个直矩形&#xff08;就是没有旋转的矩形&#xff09;。它不会考虑对象是否旋转。所以边界矩形的面积不是最小的。 cv2.boundingRect(array) 输入&#xff1a;点集 输出&#xff1a;&#xff08;x&#xff0c;y…

怎么防止文件夹被删除、复制?

当文件夹中存放重要数据时&#xff0c;我们需要严格保护文件夹的安全&#xff0c;避免文件夹被复制、删除。那么&#xff0c;该怎么防止文件夹被删除、复制呢&#xff1f;下面我们就一起来了解一下。 ​文件夹隐藏 当文件夹被隐藏时&#xff0c;其他人无法发现文件夹&#xff…

Java 中是如何获取 IP 属地的

随着互联网的普及&#xff0c;人们在使用计算机或移动设备上网时&#xff0c;都会被分配一个IP地址&#xff0c;以便进行网络通信。而当我们访问某个网站或使用某些网络服务时&#xff0c;我们通常会发现不同地区的用户会显示不同的IP属地。那么&#xff0c;在Java中是如何获取…

Lua-http库写一个爬虫程序怎么样 ?

目录 一、了解Lua-http库 二、爬虫程序的需求分析 三、爬虫程序的实现步骤 四、代码示例 总结 随着互联网的快速发展&#xff0c;网络爬虫已经成为了获取信息的重要手段之一。Lua-http库作为一个强大的HTTP库&#xff0c;可以轻松地帮助我们实现爬虫程序。本文将介绍如何使…

vector详解

迭代器 vector维护的是一个连续线性空间。普通指针可以满足条件作为vector的迭代器。 template <typename T, typename Allocalloc> class vector { public: using value_type T; using iterator value_type*; }; vector::iterator //int* vector::iterator //char* …

利用Linux socat快速搭建TCP服务器

某些场合&#xff0c;需要在Linux上快速搭建一个TCP的服务器&#xff0c;接收客户端的连接&#xff0c;返回一些数据。 一般用于测试或者负载不大&#xff0c;安全性要求不高的场合&#xff0c;达到快速搭建的目的。 本文以客户端通过服务器的3334端口&#xff0c;获取服务器…

使用 Rust 和 cURL 库下载程序

以下是一个使用 Rust 和 cURL 库的下载器程序&#xff0c;用于下载 图像。此程序使用了 https://www.duoip.cn/get_proxy 的代码。 extern crate curl; ​ use std::io::{self, Read}; use std::error::Error; ​ fn main() {let url "https://www.baidu.com";let …

TCP / UDP 概念 + 实验(计网自顶向下)

Github源码 moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES: 《计算机网络&#xff0d;自顶向下方法(原书第6版)》编程作业&#xff0c;Wireshark实验文档的翻译和解答。 (github.com) 暂定打算分2步走&#xff0c;前置是中科大对应计网黑书的视频 第1步完成14个Wire…

思维导图软件 ConceptDraw MINDMAP mac中文特色介绍

ConceptDraw MINDMAP mac是一款思维导图绘制软件&#xff0c;它可以帮助用户快速创建各种类型的思维导图&#xff0c;如组织结构图、流程图、概念图和UML图等。该软件具有直观的界面和简单易用的操作方式&#xff0c;使得用户能够轻松地创建复杂的思维导图。此外&#xff0c;它…

Qt跨平台(统信UOS)各种坑解决办法

记录Qt跨平台的坑&#xff0c;方便日后翻阅。 一、环境安装 本人用的是qt 5.14.2.直接在官网下载即可。地址&#xff1a;Index of /archive/qt/5.14/5.14.2 下载linux版本。 下载之后 添加可执行权限。 chmod 777 qt-opensource-linux-x64-5.14.2.run 然后执行。 出现坑1…

R语言生物群落(生态)数据统计分析与绘图

R 语言作的开源、自由、免费等特点使其广泛应用于生物群落数据统计分析。生物群落数据多样而复杂&#xff0c;涉及众多统计分析方法。以生物群落数据分析中的最常用的统计方法回归和混合效应模型、多元统计分析技术及结构方程等数量分析方法为主线&#xff0c;通过多个来自经典…

【C语言】指针那些事之数组传参和指针传参的区别

C语言系列 文章目录 目录 C语言系列 文章目录 前言 一&#xff0c;数组传参和指针传参 1.1一维数组传参 1.2二维数组传参 1.3一级指针传参 1.4当一个函数的参数部分为一级指针的时候&#xff0c;函数可以接收什么参数 1.5二级指针传参 1.6当函数的参数为二级指针的时…

xxl-job项目集成实战,全自动项目集成,可以直接使用到项目中

如果你看官方文档&#xff0c;在研究透&#xff0c;至少也得几天时间&#xff0c;如果你直接看我的文档&#xff0c;快速用到项目中&#xff0c;也就10分钟就搞好了。 xxl-job功能确实很强大&#xff0c;而且使用的人比较多&#xff0c;既然在使用xxl-job&#xff0c;那肯定是…

pytorch 入门 (四)案例二:人脸表情识别-VGG16实现

实战教案二&#xff1a;人脸表情识别-VGG16实现 本文为&#x1f517;小白入门Pytorch内部限免文章 参考本文所写记录性文章&#xff0c;请在文章开头注明以下内容&#xff0c;复制粘贴即可 &#x1f368; 本文为&#x1f517;小白入门Pytorch中的学习记录博客&#x1f366; 参…

ruoyi-nbcio版本从RuoYi-Flowable-Plus迁移过程记录

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 从KonBAI / RuoYi-Flowable-Plus 项目移植过来&#xff0c;开始用yarn install之后yarn run dev 还是有问…

腾讯云价格计算器有用过的吗?好用!

腾讯云服务器价格计算器可以一键计算出云服务器的精准报价&#xff0c;包括CVM实例规格价格、CPU内存费用、公网带宽收费、存储系统盘和数据盘详细费用&#xff0c;腾讯云百科txybk.com分享腾讯云价格计算器链接入口、使用方法说明&#xff1a; 腾讯云服务器价格计算器 打开腾…

Java八股文 ---Java并发篇

线程安全 线程安全就是多个线程去执行某类&#xff0c;这个类始终能表现出正确的行为&#xff0c;那么这个类就是线程安全的 我们判断是否要处理线程安全问题&#xff0c;就看有没有多个线程同时访问一个共享变量 能不能保证操作的原子性&#xff0c;考虑atomic包下的类够不够我…

Kubernetes技术与架构-网络 3

Kubernetes集群支持为Pod或者Service申请IPV4或者IPV6的地址空间。 kube-apiserver --service-cluster-ip-range<IPv4 CIDR>,<IPv6 CIDR> kube-controller-manager --cluster-cidr<IPv4 CIDR>,<IPv6 CIDR> --service-cluster-ip-range<IPv4 CI…

架构风格区别-架构案例(五十九)

管道-过滤器和仓库的区别&#xff1f; 独立的数据仓库&#xff0c;处理流独立&#xff0c;处理数据用连接仓库工具数据与处理在一起&#xff0c;改动的话需要重启系统需要仓库工具与仓库连接&#xff0c;数据与处理分离&#xff0c;性能差可以支持并发连接访问仓库&#xff0c…

MSQL系列(八) Mysql实战-SQL存储引擎

Mysql实战-SQL存储引擎 前面我们讲解了索引的存储结构&#xff0c;BTree的索引结构&#xff0c;我们一般都知道Mysql的存储引擎有两种&#xff0c;MyISAM和InnoDB,今天我们来详细讲解下Mysql的存储引擎 文章目录 Mysql实战-SQL存储引擎1.存储引擎2.MyISAM的特点3. InnoDB的特…