简单使用
在上一期我们介绍了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 |