linux上使用JNI的小例子
- 创建一个java文件HelloWorld.java
class HelloWorld{
private native void print();
public static void main(String[] args){
new HelloWorld().print();
}
static{
System.load("/绝对路径/libHellWorld.so");
}
}
- javac HelloWorld.java 编译生成HelloWorld.class
- javah -jni HelloWorld 生成HelloWorld.h头文件
- 创建HelloWorld.c文件
#include <jni.h>
#include <stdio.h>
//必须包含生成的头文件
#include "HelloWorld.h"
JNIEXPORT void JNICALL Java_HelloWorld_print(JNIEnv *env, jobject obj){
printf("Hello World!\n");
}
- gcc -fpic -shared -o libHellWorld.so HelloWorld.c 生成libHellWorld.so(注意命名规则)
- 可能出现的错误:
1.
编译提示miss jni.h和jni_md.h
只需find ./ -name “jni.h(jni_md.h)”,找到一个
拷贝到此位置就可以了sudo cp jni.h(jni_md.h) /usr/include
2.
出现java.lang.UnsatisfiedLinkError
可以换成绝对路径
//System.loadLibrary(“HelloWorld”);
System.load("/绝对路径/libHellWorld.so");
数据类型:
Java类型 | 本地类型 | 描述 |
---|
boolean | jboolean | C/C++8位整型 |
byte | jbyte | C/C++带符号的8位整型 |
char | jchar | C/C++无符号的16位整型 |
short | jshort | C/C++带符号的16位整型 |
int | jint | C/C++带符号的32位整型 |
long | jlong | C/C++带符号的64位整型 |
float | jfloat | C/C++32位浮点型 |
double | jdouble | C/C++64位浮点型 |
Object | jobject | 任何Java对象,或者没有对应java类型的对象 |
Class | jclass | Class对象 |
String | jstring | 字符串对象 |
Object[] | jobjectArray | 任何对象的数组 |
boolean[] | jbooleanArray | 布尔型数组 |