【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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Forgotten Legend

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值