Ubuntu 环境下的JNI编程 第二节 JNI的实现

Linux (Ubuntu 12.04)环境下编写JNI Linux JNI 便携与使用。 阅读详情

第一步:通过eclipse创建Java工程,目录结构如下图所示:

MainClass.java

package org.java.test;

import org.java.test.jni.TestJni;

public class MainClass {

	static
	{
		System.loadLibrary("jni-test");
	}
	public static void main(String[] args) {
		TestJni testJni =  new TestJni();
		testJni.set("hello");
		testJni.get();
	}
}

TestJni.java

package org.java.test.jni;

public class TestJni {
    public native void set(String str);
    public native String get();
}

第二步:生成jni头文件

在项目的src目录下执行命令:

javah -classpath . -jni org.java.test.jni.TestJni

生成org_java_test_jni_TestJni.h头文件

org_java_test_jni_TestJni.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class org_java_test_jni_TestJni */

#ifndef _Included_org_java_test_jni_TestJni
#define _Included_org_java_test_jni_TestJni
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     org_java_test_jni_TestJni
 * Method:    set
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_org_java_test_jni_TestJni_set
  (JNIEnv *, jobject, jstring);

/*
 * Class:     org_java_test_jni_TestJni
 * Method:    get
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_org_java_test_jni_TestJni_get
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

第三步:实现jni方法

在org/java/test目录下新建cpp目录,把生成的org_java_test_jni_TestJni.h文件导入到cpp目录下,同时建立jni-test.cpp文件以实现头文件里定义的方法


jni-test.cpp

#include "org_java_test_jni_TestJni.h"
#include <stdio.h>

/*
* Class:     JavaTest
* Method:    set
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_org_java_test_jni_TestJni_set
(JNIEnv *env, jobject object, jstring string) 
{
	printf("invoke set from C++ \n");
	char *str = (char*)env->GetStringUTFChars(string, NULL);
	printf("%s\n",str);
	env->ReleaseStringUTFChars(string, str);
};

/*
* Class:     JavaTest
* Method:    get
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_org_java_test_jni_TestJni_get
(JNIEnv *env, jobject) 
{
	printf("invoke get from C++ \n");
	return env->NewStringUTF("Hello from JNI !");
};

第四步:编译so库

 在项目的org.java.test.cpp目录下执行命令

gcc -shared -I /home/peng/Java/jdk1.8.0_172/include -I  /home/peng/Java/jdk1.8.0_172/include/linux -fPIC jni-test.cpp -o libjni-test.so

说明:因为JNI需要使用jni.h和jni_md.h这两个头文件,而jni.h文件是在你安装的JDK目录下的include文件下,而jni_md.h是在include文件下的linux目录,所以把这两个目录share进来。

第五步:配置so库路径

在org/java/test目录下新建lib目录,把生成的libjni-test.so库放到lib目录下


对libjni-test.so库点击右键->bulid path->configure build path...

选择Native library location,点击 edit选项



选择刚才so库所在的lib库目录


点击ok,运行程序


附:也可以在项目的src目录下执行

java -Djava.library.path=org/java/test/lib/ org/java/test/MainClass

命令运行程序



源代码:https://pan.baidu.com/s/1whX7Lme4bIiI-cxi41vLyA

OpenJDK Java类库一定有JNI实现吗?如何编译Windows版本和Ubuntu环境JDK?为什么编译Open JDK还需要旧版本JDK?Open JDK和Oracle JDK的区别? 本文介绍了OpenJDK相关技术知识:1) Java类库不一定依赖JNI实现;2) 详细说明Windows和Ubuntu环境下编译JDK的方法步骤;3) 解释编译OpenJDK需要旧版本JDK的原因;4) 比较OpenJDK与OracleJDK的区别;5) 说明JDK版本命名规则;6) 介绍Java不同SDK版本及Android与JDK的关系。文章提供了实用的技术指导,适合开发者参考学习。 阅读详情

相关推荐

初识JNI(Ubuntu + Java)编程

Java Native Interface(JNI)是Java平台提供的一种机制,用于在Java代码中调用本地(Native)代码。通过JNI,开发者可以在Java程序中使用C/C++等本地语言编写的代码,实现与底层系统的交互和功能扩展。你可以根据需要编写更复杂的C代码,并在Java中调用它们以实现与底层系统的交互。首先,创建一个Java类,用于加载本地代码并调用其方法。的头文件,其中包含了用于在C代码中调用Java方法的函数声明。上述C代码中,我们实现了在Java代码中声明的本地方法。

HackDashX的博客 273

在ubuntu虚拟机中开发JNI

1. Java调用C库中函数的步骤详细使用请参照《jni.pdf》官方文档(1)加载C库:在java中:加载C库,并声明在C库中实现的本地方法: System.loadLibrary("libhello"); (2)函数名映射:在C语言中: 建立Java函数名到C库函数名的映射:Java函数名 &lt;-------映射-----&gt; C库函数名其中,建立Java函数到C库函数映射的关系的方式...

yinshunjun123的专栏 404

使用JNI在Ubuntu上进行开发的示例

在本示例中,我们演示了如何在Ubuntu上使用JNI进行开发。我们首先安装了Java JDK和GCC编译器,然后编写了一个简单的Java类,其中包含一个调用本地方法的静态方法。然后,我们编写了C代码实现了Java中声明的本地方法,并生成了一个共享库。最后,我们编译并运行了Java程序,成功地调用了本地方法并输出了相应的消息。接下来,我们需要编写C代码实现我们在Java中声明的本地方法。我们可以编译并运行我们的Java程序。注意,在C代码中,我们包含了"HelloJNI.h"头文件,它是通过JDK提供的。

2301_79331387的博客 253

在Ubuntu18.04中使用JNI实现java调用C++

在Ubuntu18.04中使用JNI实现java调用C++ 工具: 1.emacs 2.eclipse 3.jdk 第一步 java代码的编写 在eclipse中新建一个项目JNI_test,并在该项目中新建文件demo.java,输入以上java代码。 第二步 用javah命令将java代码转换为本地接口类的头文件 在eclipse中的工具栏里选择project->clean…并且保证B...

crazybreeze的博客 764

关于RT-Thread中PWM无法正常输出的学习

按照官方的PWM配置,并没有输出PWM,网上有比较多的办法,试了很多,有些还是不能实现输出,这里做个记录。记录自己完成PWM输出的过程,以及修改的地方。 关于STM32CubeMX配置就不多说了,网上有很多。 首先必定是按照流程来,一定一定按照流程来!!! 需要注意的是加上通道数!!!! 这是流程上没有的,也是RTT的一点小BUG吧 配上board.c中添加的代码,我用的是PA2定时2的通道3,需要使用的朋友修改对应定时器和GPIO! void HAL_TIM_Base_MspInit(TIM_Han

weixin_42566346的博客 3552

STM32 HAL 模拟I2C从机实战:软件实现与多设备通信优化

本文详细介绍了STM32 HAL库下软件模拟I2C从机的实现方法,包括GPIO开漏配置、基础信号实现、数据收发函数编写和多设备通信优化策略。通过灵活的软件模拟方案,解决了硬件I2C接口数量限制和稳定性问题,为多传感器数据采集等应用提供了可靠的通信保障。

motor的博客 913

ubuntu20.04安装Java

默认的ubuntu20.04源仓库包含了两个openJDK软件包,Java Runtime Environment(JRE)和Java Development Kit(JDK)。JRE主要包含了Java虚拟机(JVM),类和允许你允许Java程序的二进制包。JDK包含JRE和用于构建Java应用的开发/调试工具和库文件. Java11s java的一个长期支持版本,同时也是Ubuntu20.04的默认Java开发和运行环境。 1.安装 sudo apt-get update s...

天启的博客 7773

即梦AI使用教程

摘要: 即梦AI是字节跳动推出的多模态AI创作平台,整合图片、视频、智能编辑功能,基于OmniHuman模型支持中英日三语操作。核心特点包括: 技术升级:4.0版本强化中文语义理解与微观表现力,新增故事分镜生成; 创作功能:支持文本/图片转视频、AI对口型、商业级抠图与多图层融合; 用户友好:移动/网页双端适配,灵感社区复用提示词,剪映生态无缝衔接; 应用场景:覆盖电商换装、虚拟主播、设计融合等需求,未来将开放API拓展生态。 (字数:149)

专业深耕,技术前沿 6300

ubuntu20.04 java 开发环境搭建及 JNI 使用

java开发环境搭建及JNI使用 本文采用知识共享署名 4.0 国际许可协议进行许可,转载时请注明原文链接,图片在使用时请保留全部内容,可适当缩放并在引用处附上图片所在的文章链接。 1. VSCODE 插件 2. ubuntu20.04安装Java 3. java 编译 4. JNI 4.1. JAVA调用C++ 4.2. 生成 头文件 com_huhu_test_JNIDemo 4.3. 实现 com_huhu_test_JNIDemo 4.4. 编译 com_huhu_test_JNIDemo

碧海潮生 2900

【openEuler容器镜像部署指南】

【代码】【List集合排序 】

weixin_43878094的博客 1111

问题解答:如何不通过修改底层数据库表的方式,给数据库对应的数据结构,增添新的字段?

现在需要将这张表里的内容读取到 ABAP 内表里,并且针对每个行项目,增加一个新的列字段,我随便举个例子,这个列字段名称叫 LENGTH,值为 OBJ_NAME 字段的长度,使用。最笨的办法就是下面这样定义一个新的类型,这个类型的每个字段名称,都来自数据库表 TADIR 的同名字段,在末尾再增添自定义字段 length.其实我们是做 ALV 输出,只需要 ABAP 内表变量的类型,包含 TADIR 数据库表的全部字段,再加上新的 LENGTH 字段即可。这相当于多了一个中间层,没办法直接被 ALV 处理。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 477

ubuntu下AndroidStudio快速搭建JNI

卑微小白因为项目需要,从零开始学习使用JNI进行上下层连接,在查阅大量博客使用生成.h然后碰了无数壁生成了.so文件后,突然发现了一种特别方便的搭建JNI并使用JAV调用JNI生成库的方法——直接使用AndroidStudio上的JNI模板! 1.环境搭建 使用之前一定要安装好AndroidStudio的环境,JRE、SDK、NDK等。 JRE、SDK配置方法网上有很多,这里就不多说了,主要记录一下NDK的配置。首先进入SDK Manager。 如图,勾选NDK(Side by SIde)和 CMa

BlackRabbit_的博客 991

23、电生理与CSD分析:探索大脑活动的前沿技术

本文介绍了电生理与电流源密度(CSD)分析在探索大脑活动中的前沿应用。从电生理技术的发展现状,到局部场电位(LFPs)的起源与解释,重点阐述了CSD分析的原理、实验方法及其在绘制皮层兴奋流、解析突触输入和研究自发振荡中的广泛应用。文章还总结了该领域的优势与挑战,并展望了技术改进、多模态融合、数据分析创新及临床拓展的未来方向,展示了这些技术在揭示大脑功能机制中的关键作用。

Apple的专栏 119

Ubuntu下JNI的实现与调用

转载请注明出处http://blog.youkuaiyun.com/wudiwo/article/details/7571057     反复研究技术的结果只有一个那就是让你感觉到它越来越简单。就像下面将要讲述的JNI的调用,刚开始接触的时候还感觉一头雾水,现在一切变的又是那样的清晰明朗。废话不多说,下面总结一下  环境搭建 :                   1、Ubuntu下关于JDK、SDK、

梦中梦专栏 1885

LFI Scanner 本地文件包含漏洞扫描、文件路径遍历、敏感文件读取(etcpasswd)

✅ **敏感文件读取验证**:内置`/etc/passwd、/windows/system32/drivers/etc/hosts、phpinfo.php`等敏感文件字典,一键验证漏洞可利用性;🔴 **Windows**:`/windows/win.ini`(系统配置)、`/windows/system32/drivers/etc/hosts`;🔴 **Linux**:`/etc/passwd`(用户信息)、`/proc/version`(内核版本)、`/etc/hosts`(域名解析);

寒寒豆豆软件公司的博客 130

Python爬虫-爬取猫眼演出数据

本文是该专栏的第53篇,后面会持续分享python爬虫干货知识。猫眼平台除了有影院信息之外,它还涵盖了演出信息,比如说“演唱会,音乐节,话剧音乐剧,脱口秀,音乐会,戏曲艺术,相声”等等各种演出相关信息。而本文,笔者将以猫眼平台为例,基于Python爬虫实现获取各种演出信息的数据。废话不多说,具体细节部分以及详细思路逻辑,笔者将在正文结合完整代码进行详细说明。(附带完整代码)

Python进阶专栏《爬虫实战进阶》,《Pyppeteer从入门到精通》原创作者 568

ubuntu上实现Android JNI示例

平台: ubuntu10.04 工具:eclipse,装好android-sdk(安卓开发环境),android-ndk(安卓交叉编译环境)   过程: 1.  新建android工程 JNItest: 工程目录在eclipse的workspace目录下:eclipse/workspace/JNItest HelloJNI.java中调用了native 函数 getInt(

arfee_11的专栏 593

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

ubuntu下编译JNI程序

一、 开发环境的搭建 a.  android的NDK开发需要在linux下进行: 因为需要把C/C++编写的代码生成能在arm上运行的.so文件,这就需要用到交叉编译环境,而交叉编译需要在linux系统下才能完成。 b. 安装android-ndk开发包,这个开发包可以在go

zyw123的专栏 1561

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

opencv的使用(Ubuntu linux环境,AS jni,AS java)

查看/usr/local/lib/lib文件下没有libopencv_shape.so等这三个库,再次打开/usr/local/lib/pkgconfig/opencv.pc文件,将-lopencv_shape 等三个路径删除掉。注意:1、该opencv源码编译的对应so库文件只是linux系统平台文件(我的是x86_64),如果想将该库编译为其他平台,例如arm64需要交叉编译。然后在opencv.pc中添加以下信息,注意这些信息需要与自己安装opencv时的库路径对应:(一下是我自己的内容)

zhuowalun8427的博客 1657

基于Ubuntu下的JNI的简单DEMO实现与error解决

所需环境 1. Ubuntu 系统 (本文系统 16.04 LTS) 2. JDK (请自行安装) JNI定义: JNI是Java Native Interface的缩写,通过使用Java本地接口书写程序,可以确保代码在不同的平台上方便移植。 (个人理解:很多底层功能或者硬件及驱动方面的功能是C/C++ 完成的, 想要和这些程序打交道的媒介就是JN...

moomwu的博客 278

【移动开发】如何使用ndk和jni

概述 Android系统的底层库由c/c++编写,上层Android应用程序通过Java虚拟机调用底层接口,衔接底层c/c++库与Java应用程序间的接口正是JNI(Java Native Interface)。本文将描述如何在Ubuntu下配置Android JNI的开发环境,以及如何编写一个简单的c函数库和JNI接口,并通过编写Java程序调用这些接口,最终运行在模拟器上的过程。 环境配置 1. 安装jdk 1.6 (1) 从jdk官方网站http://www.oracle.com/techne

博客 2298

java jni ffmpeg_Ubuntu下,在Eclipse中使用JNI调用ffmpeg

Android的应用层开发大部分还是采用JAVA,如果想使用ffmpeg库,就必须利用JNI,使得Java可以调用C/C++的库。JNI其实就是定义的一个转接接口,可以让Java的代码调用C/C++的库,我的理解有点像C#中调用C/C++的DLL需要一个proxy工程一样。编译好的ffmpeg库文件名为:libffmpeg.so,它是一个普通的C/C++动态链接库。下面以libffmpeg.lib...

weixin_42130786的博客 397

Eclipse + CDT 实现JNI 的方法

因为某些算法要通过c++实现,因而只能在java下用

kevinfox18的专栏 1357

如何在Android下使用JNI

1.引言 我们知道,Android系统的底层库由c/c++编写,上层Android应用程序通过Java虚拟机调用底层接口,衔接底层c/c++库与Java应用程序间的接口正是JNI(JavaNative Interface)。本文描述了如何在ubuntu下配置AndroidJNI的开发环境,以及如何编写一个简单的c函数库和JNI接口,并通过编写Java程序调用这些接口,最终运行在模拟器上的过程

达闻东的专栏 11万+

Ubuntu下Android JNI初步学习之——搭建相关环境和测试Demo

Android JNI 一、    Android JNI环境配置 A.    Windows+Eclipse+Cygwin+NDK 1)    安装配置jdk 2)    安装Eclipse,ADK 安装Android Developer Tools ,安装NDK Plugins(Eclipse C/C++插件,配置C/C++环境)。 图 1   3)    安装配置NDK

liuhaomatou的专栏 3254

JNI使用--ubuntu篇

关于Windows JNI使用,我在上一篇博客中已经详细说明 https://blog.youkuaiyun.com/qq_28398393/article/details/90580729 本篇博客主要介绍 在 ubuntu下,如何使用 JNI 一,环境: ubuntu16.04,gcc 二,使用方法: 1.创建一个java文件(JNITest.java) 采用load函数装载动态链接库,要使...

qq_28398393的博客 576
上一篇: Ubuntu 环境下的JNI编程 第一节 JAVA环境安装与配置
下一篇: ndk编译生成so动态库
枫-麟
博客等级 码龄15年 26粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值