lINUX下使用JAVA的JNI

來源:互聯網
上載者:User

 

這裡主要講述在LINUX(Ubuntu 10.04)下通過JNI調用底層.c檔案中的函數

以最簡單的“Hello”舉例

 

第一步:

寫一個JniTest.java檔案,內容如下

public class JniTest 

{

static

{

System.loadLibrary("Hello");

}

 

public native void output(); 

 

public static void main(String[] args)

{

System.out.println(System.getProperty("java.library.path")); 

JniTest test = new JniTest();  

        test.output();  

}

}

 

使用javac編譯.java檔案

再使用javah -jni JniTest會產生一個JniTest.h的標頭檔,內容如下

/* DO NOT EDIT THIS FILE - it is machine generated */

#include <jni.h>

/* Header for class JniTest */

 

#ifndef _Included_JniTest

#define _Included_JniTest

#ifdef __cplusplus

extern "C" {

#endif

/*

 * Class:     JniTest

 * Method:    output

 * Signature: ()V

 */

JNIEXPORT void JNICALL Java_JniTest_output

  (JNIEnv *, jobject);

 

#ifdef __cplusplus

}

#endif

#endif

 

注意:

1.public native void output(),這個方法可以看作介面中的一個方法,只不過是由外部的其他語言(這裡是C)來實現這個方法。

 

2.靜態塊裡的System.loadLibrary(String s)方法是根據字串s,去java.library裡去載入名為"lib" + s + ".so"的動態庫檔案(Windows下為dll).

這樣就可以訪問native方法了。

 

3.可以通過System.out.println(System.getProperty("java.library.path"));來擷取java.library的具體路徑,後面要用到。

 

第二步:

根據JniTest.h標頭檔,編寫jni_test.c檔案實現相應的方法

#include <stdio.h>

#include "JniTest.h"

#include <jni.h>

 

JNIEXPORT void JNICALL Java_JniTest_output(JNIEnv * jnienv, jobject job)

{  

  printf("Hello,ZYC!/n");  

}   

 

然後在SHELL下將其編譯成動態連結程式庫

$gcc -shared -I /usr/lib/jvm/java-6-sun-1.6.0.22/include/ -I /usr/lib/jvm/java-6-sun-1.6.0.22/include/linux/ -I /usr/include/ jni_test.c -o libHello.so

gcc參數解釋(可以通過man gcc查看)

-shared 該選項指定產生動態串連庫,不用該標誌外部程式無法串連。相當於一個可執行檔 

-I 包含路徑,這裡/usr/lib/jvm/java-6-sun-1.6.0.20/include下包含的jni.h,/usr/lib/jvm/java-6-sun-1.6.0.20/include/linux下包含的是jni-mid.h,/usr/include/包含使用者的.h檔案

-o file 將內容寫入file中,這裡寫入libHello.so

然後就會產生libHello.so這個檔案。

 

第三步:

執行方法:

1.單次執行時候指定library位置

java -Djava.library.path=. JniTest

 

2.將通過java library來執行

$sudo cp libHello.so /usr/lib/jvm/java-6-sun-1.6.0.22/jre/lib/i386/client/

後面的路徑就是通過System.out.println(System.getProperty("java.library.path"))擷取到的

然後java JniTest即可看到結果,亦可以在eclipse下使用

 

輸出結果:

dane-zhu@dane-zhu-desktop:~/workspace/JavaJni/src$ java JniTest 

/usr/lib/jvm/java-6-sun-1.6.0.22/jre/lib/i386/client:/usr/lib/jvm/java-6-sun-1.6.0.22/jre/lib/i386:/usr/lib/jvm/java-6-sun-1.6.0.22/jre/../lib/i386:.:.:.::/usr/java/packages/lib/i386:/lib:/usr/lib

Hello,ZYC!

 

That'OK!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.