当前位置: 首页 > 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

http://www.mrgr.cn/news/42073.html

相关文章:

  • 2024/10/3 408数据结构大题打卡
  • Web安全 - 安全防御工具和体系构建
  • Linux学习之路 -- 线程 -- 死锁及线程安全相关问题
  • 【Nacos架构 原理】内核设计之Nacos一致性协议
  • 数据库中 级联 详解
  • 【AIGC】内容创作——AI文字、图像、音频和视频的创作流程
  • 【C++】STL--vector
  • 将模板引擎用于 Express
  • PostgreSQL常用字符串函数
  • Pikachu-Sql Inject-insert/update/delete注入
  • Nginx限制访问频率
  • 什么是建筑资质动态核查?
  • 【算法笔记】双指针算法深度剖析
  • 【C++复习】C++11经典语法
  • UNRAID使用rclone挂在alist网盘
  • 【ADC】噪声(1)噪声分类
  • MySQL【知识改变命运】01
  • Python+Matplotlib简单示例展示泛函、变换、函数
  • 地产房源展示预约小程序制作线索发展
  • 【2024】基于mysqldump的数据备份与恢复