当前位置:首页 > CN2资讯 > 正文内容

java linux部署 linux java jni

7小时前CN2资讯


JNI是Java Native Interface的缩写,是Java平台的本地调用,从Java1.1就成为了Java标准的一部分,它允许Java代码和其它语言的代码进行互相调用,只要调用约定支持即可,尤其和C/C++的互相调用。

虽然使用Java与本地编译的代码进行交互,会丧失平台的可移植性,但是在特定情况下,这些问题是可以接受的,如:

1.使用一些旧的库
2.需要操作系统交互
3.提高程序的性能

一、jni介绍

Java是通过定义native方法,然后用其它语言实现该方法,最后在Java运行时,动态地加载该方法实现,通过调用native的方法,进而实现Java的本地调用。

1.实现架构

JVM封装了各种操作系统的差异性,提供了jni技术,使得开发中可以通过Java程序调用到操作系统的函数,进而与其它技术进行交互。下图是Linux平台jni的调用流程。Java应用程序通过jni接口调用动态链接库*.so,来实现jni的功能。


2.类型映射

Java基本数据类型与C语言基本数据类型的对应。


3.常用方法简介

(1)GetStringUTFLength 以字节为单位返回字符串的UTF-8长度

// jsize (JNICALL *GetStringUTFLength)(JNIEnv *env, jstring str) int len = (*env)->GetStringUTFLength(env, str);

(2) GetStringUTFChars 返回指向字符串的UTF-8字符数组的指针。该数组在被ReleaseStringUTFChars()释放前将一直有效

// const char* (JNICALL *GetStringUTFChars)(JNIEnv *env, jstring str, jboolean *isCopy) const char *buf = (*env)->GetStringUTFChars(env, str, NULL);

当isCopy 为JNI_FALSE,不要修改返回值,不然将改变java.lang.String的不可变语义。 一般会把isCopy设为NULL,不关心Java VM对返回的指针是否直接指向java.lang.String的内容
(3) ReleaseStringUTFChars 通知虚拟机平台相关代码无需再访问utf,utf参数是一个指针,可利用GetStringUTFChars()获得

// void (JNICALL *ReleaseStringUTFChars)(JNIEnv *env, jstring str, const char* chars) (*env)->ReleaseStringUTFChars(env, str, buf);

(4)NewStringUTF 利用UTF-8字符数组构造新java.lang.String对象

// jstring (JNICALL *NewStringUTF)(JNIEnv *env, const char *utf) (*env)->NewStringUTF(env, "hello");

二、jni实现步骤
我们知道java是可以调用C/C++程序的,也就时JNI编程,我们以一个最简单的Helleworld!程序,下面的程序实在Ubuntu11.04上面实现的。
(1)首先,定义java类,在java类中声明native方法,如下:

public class Main { static { System.loadLibrary("main"); } private native void jniTest(String str); /** * @param args */ public static void main(String[] args) { Main main = new Main(); String str = "hello world!"; main.jniTest(str); } }

代码中有System.loadLibrary(“main”);也就是加载共享库,这个库是什么来头后面会说到。
该Main.cpp函数的路径放在 “/home/project/jniTest/src”
(2)通过javac编译java源文件,得到对应的class文件,这个大家都知道的。

javac Main.java

(3)通过javah生成头文件

javah Main

头文件的内容如下所示:

/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class Main */ #ifndef _Included_Main #define _Included_Main #ifdef __cplusplus extern "C" { #endif /* * Class: Main * Method: jniTest * Signature: (Ljava/lang/String;)V */ JNIEXPORT void JNICALL Java_Main_jniTest (JNIEnv *, jobject, jstring); #ifdef __cplusplus } #endif #endif

(4)根据头文件编写对应的.c文件。
首先,先生成一个同名的.c文件。

vim Main.c

再去修改其内容。

#include "Main.h" #include <stdio.h> JNIEXPORT void JNICALL Java_Main_jniTest(JNIEnv *evn, jobject obj, jstring jstr) { const jbyte* str =(const jbyte*) (*evn)->GetStringUTFChars(evn, jstr, JNI_FALSE); printf("%s\n", str); (*evn)->ReleaseStringUTFChars(evn, jstr, (const char* )str); return; }

(5)根据.c文件编译生成动态共享库,即.so文件。在这儿生成共享库时使用GCC, 必须通知编译器在何处查找此 Java 本地方法的支持文件(支持文件在不同的系统路徑有所不同),并且显式通知编译器生成位置无关的代码,如下所示。

gcc -I/usr/java/jdk1.8.0_121/include/ -I/usr/java/jdk1.8.0_121/include/linux -fPIC -shared -o Main.c

(6)生成的动态共享库还需要告诉动态链接程序此共享文件的路径,也就时系统环境变量:LD_LIBRARY_PATH,一般可以这样设定

export LD_LIBRARY_PATH=`/home/project/jniTest/src/`:$LD_LIBRARY_PATH #‘地址’通过pwd查得

(7)在命令行执行Main.class就行了

[root@instance-4trd9j2v src]# java Main hello world!

    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/32334.html

    分享给朋友:

    “java linux部署 linux java jni” 的相关文章

    腾讯云建站停止服务的影响与应对策略

    腾讯云建站(CloudPages)作为腾讯云的一项重大创新,一直以来都旨在简化网站建设过程。这个一站式自研模板建站SaaS产品,背后的团队努力希望通过无代码和零基础的设计,帮助更多的中小企业顺利实现数字化转型。我的朋友们也曾尝试过这个平台,发现它在解决数字化营销关键痛点方面表现出色。 CloudPa...

    便宜VPS的选择与使用指南,帮你找到高性价比服务器

    便宜VPS的定义与概述 在讨论便宜VPS之前,我们先了解一下什么是VPS。VPS的全称是“虚拟专用服务器”,它实际上是一种将物理服务器划分成多个虚拟服务器的技术。每个VPS拥有独立的操作系统和资源,相当于拥有自己的私人服务器。这意味着,你可以自由安装软件、配置设置,像使用独立服务器一样使用VPS,但...

    香港VPS推荐:如何选择适合你的虚拟私人服务器

    在进入VPS的世界之前,理解什么是VPS非常重要。VPS,全称为虚拟私人服务器,它实际上是利用物理服务器上的资源,通过虚拟化技术,创建出多个独立的小型服务器。这种方式使得每个VPS都可以运行自己的操作系统,用户可以自由配置和管理,就像拥有一台独立的服务器一样。其实,我最初接触VPS时,正是被这种独立...

    如何有效优化后重置流量管理以提高客户忠诚度

    后重置流量的基本概念 后重置流量,简单来说,是指在广告或市场推广活动进行重置后,仍旧能够吸引到的用户流量。这种流量的定义不仅涵盖了用户的访问数,还强调了这些用户与品牌的关系。在今天的数字营销环境中,后重置流量逐渐成为了评估广告效果和用户粘性的关键指标之一。 我认识到后重置流量的重要性在于,它不仅能够...

    中转机:提升航班灵活性与旅行体验的最佳选择

    中转机的基本定义 中转机,是在航空运输中大量使用的一种方式。简单来说,就是乘客在一段航程中需要在特定的中转站停留,然后再继续前往他们的最终目的地。这个过程中,乘客的航空器可能会更换,或者在中转站转机的时间不同。中转机的作用主要体现在提高航班的灵活性与覆盖范围上。 我想起了自己那次在国外旅行时的经历。...

    AS4134:全球互联网中的自主系统与数据传输的未来

    什么是AS4134? AS4134是一个全球互联网中的自治系统编号,这个编号用于标识网络中的各种自治系统。让我简单说一下,自治系统可以被理解为单一的网络或网络集合,在运行自己的路由协议时相对独立。AS4134作为其中的一部分,协助数据在互联网中高效而安全地传输。当你在网上冲浪时,实际上是在通过多个这...