在Linux環境下編寫Java程序調用C函數實現流程

首先確保自己的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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章