当前位置: 首页 > news >正文

【JNI】普通类型的基本使用

简单使用

在上一期我们介绍了JNI的基本使用,这里简单介绍一下普通类型

HelloJNI.java:这里计算两个整型数的平均值,返回值类型为double

public class HelloJNI { 

    static {
       System.loadLibrary("hello"); 
    }
  
    private native String HelloWorld();
    private native double avg(int n1, int n2);
  
    public static void main(String[] args) {
       System.out.println(new HelloJNI().HelloWorld());
       System.out.println(new HelloJNI().avg(8,3));
    }
 }

输入命令编译:

javac -h . HelloJNI.java

生成HelloJNI.h:

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

#ifndef _Included_HelloJNI
#define _Included_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloJNI
 * Method:    HelloWorld
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_HelloJNI_HelloWorld
  (JNIEnv *, jobject);

/*
 * Class:     HelloJNI
 * Method:    avg
 * Signature: (II)D
 */
JNIEXPORT jdouble JNICALL Java_HelloJNI_avg
  (JNIEnv *, jobject, jint, jint);

#ifdef __cplusplus
}
#endif
#endif

然后编写对用C++实现代码:

#include "HelloJNI.h"
#include <stdio.h>
#include <jni.h>
using namespace std;

JNIEXPORT jstring JNICALL Java_HelloJNI_HelloWorld(JNIEnv *env, jobject obj){
    return env->NewStringUTF("JNI, hello world!");
} 

JNIEXPORT jdouble JNICALL Java_HelloJNI_avg(JNIEnv *env, jobject obj, jint a, jint b){
    return ((jdouble)a+b)/2;
}

编译生成共享库,然后运行

g++ -fpic -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/linux" -shared -o libhello.so HelloJNI.cpp
java -Djava.library.path=. HelloJNI

运行结果:

image-20241003184544123

源码中的转换类型

使用下图命令查看源码:

image-20241003184814520

下图展示了JNI类型与C/C++类型的相互转换:

image-20241003184901291

剩余部分变量定义:

image-20241003185353613

image-20241003185425631

C/C++JNI
signed charjbyte
unsigned charjboolean
unsigned shortjchar
shortjshort
intjint
long/long longjlong(64 bits)
floatjfloat
doublejdouble

相关文章:

  • 【C++】模拟实现红黑树
  • Ubuntu安装Hadoop3.4
  • YOLOv8 结合设计硬件感知神经网络设计的高效 Repvgg的ConvNet 网络结构 ,改进EfficientRep结构
  • PostgreSQL是否有等待事件
  • 无人机电力巡检:点亮电力巡检新视野!
  • Proxyless的多活流量和微服务治理
  • 第十六讲-选择控件QSpinBox
  • 大模型笔记05--coze经典案例分析
  • 1000题-计算机网络系统概述
  • 逻辑回归(下): Sigmoid 函数的发展历史
  • 看480p、720p、1080p、2k、4k、视频一般需要多大带宽呢?
  • 四非人的保研之路,2024(2025届)四非计算机的保研经验分享(西南交通、苏大nlp、西电、北邮、山软、山计、电科、厦大等)
  • Oracle中MONTHS_BETWEEN()函数详解
  • IT新秀系列:Go语言的兴起
  • webpack配置全面讲解【完整篇】
  • Linux 磁盘管理
  • kafka测试
  • 一个简单的摄像头应用程序1
  • 【docker笔记8-镜像推送】
  • 尝鲜使用 YOLO V11 Fine-Tuning 训练自定义的目标检测模型
  • 印巴战火LIVE丨印巴互相发动无人机袭击,巴官员称两国已在国安层面接触
  • 纽约大学朗格尼医学中心的转型带来哪些启示?
  • 鸿蒙电脑正式亮相,五年布局积累超2700项核心专利
  • 山东滕州一车辆撞向公交站台致多人倒地,肇事者被控制,案件已移交刑警
  • 山大齐鲁医院回应护士论文现“男性确诊子宫肌瘤”:给予该护士记过处分、降级处理
  • 射箭世界杯赛上海站即将开幕,多方联动讲好上海故事