【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
 
运行结果:

源码中的转换类型
使用下图命令查看源码:

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

剩余部分变量定义:


| C/C++ | JNI | 
|---|---|
| signed char | jbyte | 
| unsigned char | jboolean | 
| unsigned short | jchar | 
| short | jshort | 
| int | jint | 
| long/long long | jlong(64 bits) | 
| float | jfloat | 
| double | jdouble | 
