首先確保自己的Linux系統有沒有對應的Java環境,如果沒有要先在Linux上進行java的安裝與配置
1.下載JDK
進入 Oracle官網 下載對應的JDK。
這裏以jdk-8u231-linux-i586.tar.gz爲例
2.創建java目錄
在/usr/目錄下創建java目錄
sudo mkdir /usr/java
cd /usr/java
把下載好的jdk-8u231-linux-i586.tar.gz放在目錄/usr/java/中。
3.解壓JDK
sudo tar -zxvf jdk-8u231-linux-i586.tar.gz
4.設置環境變量
修改profile文件
sudo vim /etc/profile
在文件末尾添加如下內容並保存
set java environment
JAVA_HOME=/usr/java/jdk1.8.0_231
JRE_HOME=/usr/java/jdk1.8.0_231/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
刷新環境變量
source /etc/profile
5.測試是否安裝成功
java -version
顯示 java 版本信息,則說明 JDK 安裝成功
java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot(TM) Client VM (build 25.231-b11, mixed mode)
接下來實現一個通過JNI(Java Native Interface)的Native方法 實現java調用C代碼的例子
1.實現java代碼。文件名: test.java
public class test
{
static
{
System.load("/home/farsight/java_code/jni_native/native.so");
}
public static void main(String[] args)
{
NativeMethodTest nmt = new NativeMethodTest();
int nt = nmt.intMethod(68);
boolean bool = nmt.booleanMethod(true);
String txt = nmt.stringMethod("java");
int sum = nmt.intArrayMethod(new int[] {1, 2, 3, 4, 5, 6, 9, 15});
System.out.println("intMethod:" + nt);
System.out.println("booleanMethod:" + bool);
System.out.println("stringMethod:" + txt);
System.out.println("intArrayMethod:" + sum);
}
}
class NativeMethodTest
{
public native int intMethod(int n);
public native boolean booleanMethod(boolean bool);
public native String stringMethod(String str);
public native int intArrayMethod(int[] arr);
}
2.編譯java代碼
javac test
生成NativeMethodTest.class和test.class
3.編譯生成頭文件
javah -jni NativeMethodTest
修改NativeMethodTest.h中的 include <jni.h>爲
#include "/usr/java/jdk1.8.0_231/include/jni.h"
最終NativeMethodTest.h 內容如下
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "/usr/java/jdk1.8.0_231/include/jni.h"
/* Header for class NativeMethodTest */
#ifndef _Included_NativeMethodTest
#define _Included_NativeMethodTest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: NativeMethodTest
* Method: intMethod
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_NativeMethodTest_intMethod
(JNIEnv *, jobject, jint);
/*
* Class: NativeMethodTest
* Method: booleanMethod
* Signature: (Z)Z
*/
JNIEXPORT jboolean JNICALL Java_NativeMethodTest_booleanMethod
(JNIEnv *, jobject, jboolean);
/*
* Class: NativeMethodTest
* Method: stringMethod
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_NativeMethodTest_stringMethod
(JNIEnv *, jobject, jstring);
/*
* Class: NativeMethodTest
* Method: intArrayMethod
* Signature: ([I)I
*/
JNIEXPORT jint JNICALL Java_NativeMethodTest_intArrayMethod
(JNIEnv *, jobject, jintArray);
#ifdef __cplusplus
}
#endif
#endif
4.編寫頭文件對應的c代碼
添加新文件NativeMethodTest.c 內容如下:
#include "NativeMethodTest.h"
#include <string.h>
JNIEXPORT jint JNICALL Java_NativeMethodTest_intMethod
(JNIEnv *env, jobject obj, jint i)
{
return i * i;
}
JNIEXPORT jboolean JNICALL Java_NativeMethodTest_booleanMethod
(JNIEnv *env, jobject obj, jboolean b)
{
return !b;
}
JNIEXPORT jstring JNICALL Java_NativeMethodTest_stringMethod
(JNIEnv *env, jobject obj, jstring string)
{
const char* str = (*env)->GetStringUTFChars(env, string, 0);
char cap[128] = {0};
strcpy(cap, str);
(*env)->ReleaseStringUTFChars(env, string, 0);
return (*env)->NewStringUTF(env, cap);
}
JNIEXPORT jint JNICALL Java_NativeMethodTest_intArrayMethod
(JNIEnv *env, jobject obj, jintArray array)
{
int i, sum = 0;
jsize len = (*env)->GetArrayLength(env, array);
jint *body = (*env)->GetIntArrayElements(env, array, 0);
for(i = 0; i < len; i++)
{
sum += body[i];
}
(*env)->ReleaseIntArrayElements(env, array, body, 0);
return sum;
}
5.編譯c代碼生成動態庫
gcc NativeMethodTest.c -fpic -shared -o native.so
6.運行java程序
java test