Linux 環境Java 調用C

請先配置Java環境...

1.創建Java文件Hello.java

public class Hello{
	public native void HelloWorld();
	static{
		System.loadLibrary("hello");
	}
	
	public static void main(String[] args){
	
		new Hello().HelloWorld();
	}
}

2.編輯Java

javac Hello.java

3.生成java頭文件

javah -jni Hello
[root@BigData116 tools]# ls
Hello.class  Hello.h  Hello.java

多了一個.h 文件

4. more Hello.h

[root@BigData116 tools]# more Hello.h 
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Hello */

#ifndef _Included_Hello
#define _Included_Hello
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Hello
 * Method:    HelloWorld
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_Hello_HelloWorld
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

5.編輯c文件

[root@BigData116 tools]# touch Hello.c
[root@BigData116 tools]# vi Hello.c
#include <stdio.h>
#include <stdlib.h>
#include "jni.h"
#include "Hello.h"

JNIEXPORT void JNICALL JNICALL Java_Hello_HelloWorld (JNIEnv *env, jobject obj)
{
	printf("hello world ,i am from Hello.c");
}

6.-fPIC 選項作用於編譯階段,告訴編譯器產生與位置無關代碼

gcc -fPIC -I $JAVA_HOME/include -I $JAVA_HOME/include/linux -c Hello.c
[root@BigData116 tools]# ls
Hello.c  Hello.class  Hello.h  Hello.java  Hello.o

多了個.o 文件

7.生成共享庫格式.

動態鏈接文件稱爲動態共享對象 (Dynamic Shared Objects,DSO),一般是以 .so 爲擴展名的文件

[root@BigData116 tools]# gcc -shared Hello.o -o libhello.so

8.運行測試

[root@BigData116 tools]# java Hello
Exception in thread "main" java.lang.UnsatisfiedLinkError: no hello in java.library.path
	at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)
	at java.lang.Runtime.loadLibrary0(Runtime.java:870)
	at java.lang.System.loadLibrary(System.java:1122)
	at Hello.<clinit>(Hello.java:4)

設置library 環境 bash_profile

export LD_LIBRARY_PATH=/root/tools

使環境生效

source ~/.bash_profile

運行 java Hello

[root@BigData116 tools]# java Hello
hello world ,i am from Hello.c

 

總的來說,將一個本地方法鏈接到Java程序中需要經過以下5個步驟:

  1. 在Java類中聲明一個本地方法;
  2. 運行javah以獲得包含該方法的C聲明的頭文件;
  3. 用C實現該本地方法;
  4. 將代碼置於共享類庫中;
  5. 在Java程序中加載該類庫。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章