第一步:通过eclipse创建Java工程,目录结构如下图所示:
MainClass.java
package org.java.test;
import org.java.test.jni.TestJni;
public class MainClass {
static
{
System.loadLibrary("jni-test");
}
public static void main(String[] args) {
TestJni testJni = new TestJni();
testJni.set("hello");
testJni.get();
}
}
TestJni.java
package org.java.test.jni;
public class TestJni {
public native void set(String str);
public native String get();
}
第二步:生成jni头文件
在项目的src目录下执行命令:
javah -classpath . -jni org.java.test.jni.TestJni
生成org_java_test_jni_TestJni.h头文件
org_java_test_jni_TestJni.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class org_java_test_jni_TestJni */
#ifndef _Included_org_java_test_jni_TestJni
#define _Included_org_java_test_jni_TestJni
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: org_java_test_jni_TestJni
* Method: set
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_org_java_test_jni_TestJni_set
(JNIEnv *, jobject, jstring);
/*
* Class: org_java_test_jni_TestJni
* Method: get
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_org_java_test_jni_TestJni_get
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
第三步:实现jni方法
在org/java/test目录下新建cpp目录,把生成的org_java_test_jni_TestJni.h文件导入到cpp目录下,同时建立jni-test.cpp文件以实现头文件里定义的方法
jni-test.cpp
#include "org_java_test_jni_TestJni.h"
#include <stdio.h>
/*
* Class: JavaTest
* Method: set
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_org_java_test_jni_TestJni_set
(JNIEnv *env, jobject object, jstring string)
{
printf("invoke set from C++ \n");
char *str = (char*)env->GetStringUTFChars(string, NULL);
printf("%s\n",str);
env->ReleaseStringUTFChars(string, str);
};
/*
* Class: JavaTest
* Method: get
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_org_java_test_jni_TestJni_get
(JNIEnv *env, jobject)
{
printf("invoke get from C++ \n");
return env->NewStringUTF("Hello from JNI !");
};
第四步:编译so库
在项目的org.java.test.cpp目录下执行命令
gcc -shared -I /home/peng/Java/jdk1.8.0_172/include -I /home/peng/Java/jdk1.8.0_172/include/linux -fPIC jni-test.cpp -o libjni-test.so
说明:因为JNI需要使用jni.h和jni_md.h这两个头文件,而jni.h文件是在你安装的JDK目录下的include文件下,而jni_md.h是在include文件下的linux目录,所以把这两个目录share进来。
第五步:配置so库路径
在org/java/test目录下新建lib目录,把生成的libjni-test.so库放到lib目录下
对libjni-test.so库点击右键->bulid path->configure build path...
选择Native library location,点击 edit选项
选择刚才so库所在的lib库目录
点击ok,运行程序
附:也可以在项目的src目录下执行
java -Djava.library.path=org/java/test/lib/ org/java/test/MainClass
命令运行程序
源代码:https://pan.baidu.com/s/1whX7Lme4bIiI-cxi41vLyA