使用jni實現Java調用C代碼,步驟:html
1,下載ndk,連接:http://developer.android.com/tools/sdk/ndk/index.html;解壓 ,java
2,若是是windows系統,須要安裝Cygwin工具,這是window下模擬Linux編譯環境的工具(由於Android內核就是Linux);若是windows系統的同窗就去找安裝這個工具的教程;android
3,若是是Linux系統或者mac系統,就直接配置NDK環境變量(我是mac系統,在這裏就介紹mac系統的了),和配置adb環境變量同樣,將ndk解壓路勁加入到環境變量文件中,而後在終端中就能夠直接編譯了;windows
4,建立一個Android project,在.java文件中定義一個native方法:
工具
public native String fromeC();
5,在項目根目錄下建立一個jni文件夾,在這個文件夾下建立一個.c文件,用來實現咱們定義的native方法;代碼以下:ui
#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文件,定義一些規範:代碼以下:spa
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 ;code
8,編譯完成以後,在根目錄會生成libs文件夾,裏面的armeabi子文件夾中會有JNIMp3Encode.so 庫。htm
9,在JNIMp3Encode定義了native方法的類中,用靜態代碼塊加入.so類庫:以下:對象
public native String fromeC();; static{ System.loadLibrary("JNIMp3Encode");//這個名字要和在Android.mk文件中定義的LOCAL_MODULE := JNIMp3Encode這個名字同樣 }
10,而後在其餘.java文件中就能夠調用fromeC();這個本地方法了;