安卓jni開發demo

1.在安卓工程(jniTest)下建立一個jni的目錄

2.在相關的類中(例如:MainActivity.java)加入loadLibrary

    static int hello = 0;
    static{
        System.loadLibrary("hello-jni");//注意1
        hello = hello();
    } 
    private native static int hello();//注意2
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

3.生成.h文件

在src目錄下 執行javah com.example.test2.MainActivity 後生成.h文件,將其拷貝到jni目錄下,如果不需要.h文件,該步驟可以省略。

4.寫C(C++)代碼和Android.mk文件 (jni目錄下),可以參考NDK的sample下的hello-jni的例子。

android.mk:

Android.mk是用來生成so文件的配置文件,我們來看看裏面是什麼:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)
include $(BUILD_SHARED_LIBRARY)表示會生成一個動態鏈接庫,即so文件,生成的庫文件名稱爲lib*.so
LOCAL_MODULE    := hello-jni表示將要生成一個名稱爲libhello-jni.so的庫文件
LOCAL_SRC_FILES := hello-jni.c表示生成庫文件的源文件是hello-jni.c

hello-jni.c:

#include <jni.h>
#include <stdlib.h>
#include <stdio.h>
JNIEXPORT jint JNICALL Java_com_example_test2_MainActivity_hello
  (JNIEnv* env, jobject thiz) {

    return 100;
}

這個函數從根據什麼原則生成的呢?是根據src下的HelloJni.java文件中的函數 public native String stringFromJNI();生成的。命名規則爲:
Java_(固定開頭)com_example_hellojni(用”_”連接的包名)_HelloJni(類名)_stringFromJNI(函數名)

3、新建並配置一個新的Builder
1) 點擊Project->Properties->Builders->New,新建立一個Builder。在彈出的對話框上面點擊Program,點擊OK;
2) 在彈出的對話框【Edit Configuration】中,配置選項卡【Main】:
Location中需要填入nkd-build.cmd的路徑(NDK安裝目錄下)。
WorkingDiretcoty中需要填入HelloJni的工程根目錄。
3) 在【EditConfiguration】中,配置選項卡【Refresh】:
勾選“Refresh resources upon completion”,
勾選“The entire workspace”,
勾選“Recuresively include sub-folders”。
4)在【EditConfiguration】中,配置選項卡【Build Options】:
勾選“After a “Clean””,
勾選“During manual builds”,
勾選“During auto builds”,
勾選“Specify working set of relevant resources”。
點擊“Specify Resources…”勾選TestNDK工程的“jni“目錄,Finish!
保存設置,點擊OK。
4、生成so文件
由於我們勾選了“During auto builds”,所以在工程有所改變的時候,so文件便會自動編譯,正確生成以後就能在工程目錄下發現多了兩個文件夾,文件夾libs\armeabi目錄下生成了一個叫libhello-jni.so的文件。至此,使用NDK生成so文件的工作就完成了。
5、so文件的調用
在HelloJni.java文件中有一段代碼:
static {
System.loadLibrary(“hello-jni”);
}
使用loadLibrary就可以加載該so文件了,加載的時候不需要寫libhello-jni.so,只要寫hello-jni就可以了。

參考文章:http://blog.csdn.net/laczff21/article/details/7542236

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2013/0415/1166.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章