这里通过简单程序代码带大家认识一下Java中的JNI. 现在在ubuntu环境下编写代码.
1.编写含有native方法的类.
package me.hutaishi.jni;
/**
* Author: hutaishi@qq.com
* Date: 17-3-30
* Description:
*/
public class TestJni {
static {
System.loadLibrary("TestJni");
}
public native void testJni();
public static void main(String[] args) {
new TestJni().testJni();
}
}
2.编译含有native方法的类. 进入src目录.调用javac编译成class文件
javac me/hutaishi/jni/TestJni.java
3.调用Javah生成.h头文件,后面用C/C++来实现native方法.
javah -jni me.hutaishi.jni.TestJni
在src目录下生成了me_hutaishi_jni_TestJni.h文件.打开文件查看下代码
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class me_hutaishi_jni_TestJni */
#ifndef _Included_me_hutaishi_jni_TestJni
#define _Included_me_hutaishi_jni_TestJni
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: me_hutaishi_jni_TestJni
* Method: testJni
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_me_hutaishi_jni_TestJni_testJni
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
4.接下来用c/c++代码实现native方法. 编写一个cpp文件. 注意方法签名要和.h文件一样.建议拷贝方法签名
#include <stdio.h>
#include <jni.h>
#include "me_hutaishi_jni_TestJni.h"
JNIEXPORT void JNICALL Java_me_hutaishi_jni_TestJni_testJni
(JNIEnv *, jobject) {
printf("from me_hutaishi_jni_TestJni.cpp function");
printf("Hello World!\n");
}
5.调用g++生成动态链接库.
g++ -fPIC -shared -I /home/hutaishi/Java/jdk1.8.0_111/include
-I /home/hutaishi/Java/jdk1.8.0_111/include/linux
me_hutaishi_jni_TestJni.cpp -o libTestJni.so
6.接下来运行带有native方法的类.
java -Djava.library.path=. me.hutaishi.jni.TestJni
输出如下.调用了C/C++方法进行输出
from me_hutaishi_jni_TestJni.cpp functionHello World!