[Android]Linux下JNI簡單實現過程,androidjni

來源:互聯網
上載者:User

[Android]Linux下JNI簡單實現過程,androidjni

首先編寫一個java程式

HelloJNI.java

public class HelloJNI{    public native void displayHelloJNI();//所有native關鍵詞修飾的都是對本地的聲明        static{        System.loadLibrary("MyLib");//載入本地庫    }    public static void main(String[] args){        new HelloJNI().displayHelloJNI();    }}

 

聲明native方法:如果你想將一個方法做為一個本地方法的話,那麼你就必須聲明該方法為native的,並且不能實現。
System.loadLibrary("MyLib");載入動態庫
我們可以這樣理解:我們的方法 displayHelloWorld()沒有實現,但是我們在下面就直接使用了,所以必須在使用之前對它進行初始化)這裡一般是以static塊進行載入的。同時需要注意的是System.loadLibrary();的參數“hello”是動態庫的名字。

編譯
javac HelloJNI.java 得到 HelloJNI.class

產生.h標頭檔
javah HelloJNI
得到 HelloJNI.h

/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class HelloJNI */#ifndef _Included_HelloJNI#define _Included_HelloJNI#ifdef __cplusplusextern "C" {#endif/* * Class:     HelloJNI * Method:    displayHelloJNI * Signature: ()V */JNIEXPORT void JNICALL Java_HelloJNI_displayHelloJNI  (JNIEnv *, jobject);#ifdef __cplusplus}#endif#endif

 

這個h檔案相當於我們在java裡面的介面,這裡聲明了一個Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject);方法,然後在我們的本地方法裡面實現這個方法,也就是說我們在編寫C/C++程式的時候所使用的方法名必須和這裡的一致


編寫本地方法實現和由javah命令產生的標頭檔裡面聲明的方法名相同的方法。
test.c

#include<stdio.h>#include"jni.h"#include"HelloJNI.h"JNIEXPORT void JNICALL Java_HelloJNI_displayHelloJNI  (JNIEnv *env, jobject obj){    printf("this is a JNI test program!\n");    return;}

 

需要將jni.h(該檔案可以在%JAVA_HOME%/include檔案夾下面找到)檔案引入,因為在程式中的JNIEnv、 jobject等類型都是在該標頭檔中定義的;另外在第2行需要將HelloWorld.h標頭檔引入(我是這麼理解的:相當於我們在編寫java程式的時候,實現一個介面的話需要聲明才可以,這裡就是將HelloWorld.h標頭檔裡面聲明的方法加以實現。當然不一定是這樣)。

將test.c編譯成動態連結程式庫 目前的目錄下

gcc -shared -I /home/du/jdk1.7.0_71/include -I /home/du/jdk1.7.0_71/include/linux test.c -o libMyLib.so

 

得到libMyLib.so動態連結程式庫

在HelloJNI.java中我們LoadLibrary方法載入的是“MyLib”,
可我們產生的Library卻是libMyLib。這是Linux的連結規定的,
一個庫的必須要是:lib+庫名+.so。連結的時候只需要提供庫名就可以了

運行HelloJNI.java

java HelloJNI

Exception in thread "main" java.lang.UnsatisfiedLinkError: no MyLib in java.library.path

 

java -Djava.library.path=. HelloJNI

 

運行 或者

export LD_LIBRARY_PATH=/home/du/test_code:$LD_LIBRARY_PATHjava HelloJNI

即可獲得輸出。

 

參考:

Linux(Ubuntu)下JNI入門

Linux下JNI的使用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.