Android JNI 使用

jopen 10年前發布 | 21K 次閱讀 Android Android開發 移動開發

使用jni實現Java調用C代碼,步驟:

1,下載ndk,鏈接:http://developer.android.com/tools/sdk/ndk/index.html;解壓 ,

2,如果是windows系統,需要安裝Cygwin工具,這是window下模擬Linux編譯環境的工具(因為Android內核就是Linux);如果windows系統的同學就去找安裝這個工具的教程;

3,如果是Linux系統或者mac系統,就直接配置NDK環境變量(我是mac系統,在這里就介紹mac系統的了),和配置adb環境變量一樣,將ndk解壓路勁加入到環境變量文件中,然后在終端中就可以直接編譯了;

4,創建一個Android project,在.java文件中定義一個native方法:

public native String  fromeC();

5,在項目根目錄下創建一個jni文件夾,在這個文件夾下創建一個.c文件,用來實現我們定義的native方法;代碼如下:

#include <jni.h>
#include <stdio.h>
/*
 * 把Java的方法跟C的方法做個對應,一定要符合這些命名規則,才能java才能找到對應的c代碼
 * type:Java
 * PackageName:com_baiyou_mp3ecode    這個類所在的包
 * ClassName:   JNIMp3Encode  native方法所在的類
 * MethodName:    fromC
 * obj:代表調用C代碼的Java對象
 */
jstring Java_com_baiyou_mp3ecode_JNIMp3Encode_fromC
(JNIEnv *env, jobject obj)
{
    //c代碼
    char* cstr = "hello from c";
    return (**env).NewStringUTF(env,cstr);
}

/*
 * type:Java
 * Package:com_baiyou_mp3ecode
 * Class:     JNIMp3Encode
 * Method:    destroy
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_baiyou_mp3ecode_JNIMp3Encode_destroy
(JNIEnv *env, jobject obj)
{
    lame_close(lame);
}

6,在jni目錄下創建Android.mk文件,定義一些規范:代碼如下:

LOCAL_PATH := $(call my-dir)
 
include $(CLEAR_VARS)
 
#編譯后的c可執行性文件叫啥名
LOCAL_MODULE        := JNIMp3Encode

#需要被編譯的C源文件
LOCAL_SRC_FILES    :=JNIMp3Encode.c

LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)

7,打開終端,切換到jni目錄下編譯.c文件,鍵入 ndk-build  ;

8,編譯完成之后,在根目錄會生成libs文件夾,里面的armeabi子文件夾中會有JNIMp3Encode.so 庫。

9,在JNIMp3Encode定義了native方法的類中,用靜態代碼塊加入.so類庫:如下:

public native String  fromeC();;

    static{
        System.loadLibrary("JNIMp3Encode");//這個名字要和在Android.mk文件中定義的LOCAL_MODULE        := JNIMp3Encode這個名字一樣
    }

10,然后在其他.java文件中就可以調用fromeC();這個本地方法了;

 

 

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!