android eclipse ndk使用記錄

爲方便開發jni程序,android提供了ndk包來簡化開發過程,避免開發人員下載完整的平臺代碼,而且能夠在windows環境下集成到eclipse裏面,大大加快了開發速度。這裏記錄下一個簡單例子。java

ADT開發環境:adt-bundle-windows-x86-20140702 Version 23.0.2android

NDK的開發包:android-ndk-r10dwindows

NDK的eclipse插件:com.android.ide.eclipse.ndk_23.0.2.1259578.jar 保存到eclipse/plugins/目錄下面app

從新打開eclipse,在Window -> Perferences -> Android下面會出現NDK的選項,在NDK Location裏面選擇android-ndk-r10declipse

的路徑位置,如:D:\workspace\prebuild\android-ndk-r10d。 Apply以後按OK退出。ide

 

準備工做完成以後,開始新建工程。函數

1. 新建一個android工程,如ndktest,com.example.ndktestui

2. 而後右鍵 -> Android Tools -> Add Native Support,在彈出的對話框裏面填入jni共享庫的名稱,如:libndktest.so,點擊肯定以後eclipse會自動生成一個jni目錄,並在該目錄生成一個Android.mk和一個ndktest.cpp文件。this

3. 編輯Activity類,添加jni函數的聲明,新增長載動態庫函數System.loadLibrary和一個JNI函數的聲明spa

private native String printJNI(String inputStr);

 1 public class MainActivity extends Activity {
 2 
 3     static {
 4         System.loadLibrary("ndktest");
 5     }
 6     
 7     private native String printJNI(String inputStr);
 8     
 9     @Override
10     protected void onCreate(Bundle savedInstanceState) {
11         super.onCreate(savedInstanceState);
12         setContentView(R.layout.activity_main);
13         Log.d("TAG", printJNI("test"));
14     }
15 
16     @Override
17     public boolean onCreateOptionsMenu(Menu menu) {
18         // Inflate the menu; this adds items to the action bar if it is present.
19         getMenuInflater().inflate(R.menu.main, menu);
20         return true;
21     }
22 
23 }

4. 打開命令行,進入到classes目錄:d:\workspace\Android\ndktest\bin\classes

執行javah com.example.ndktest.ManActivity, 以後會自動生成一個符合jni規範的頭文件:

com_example_ndktest_MainActivity.h

5. 拷貝com_example_ndktest_MainActivity.h到jni目錄下,在ndktest.cpp裏面包含該頭文件

com_example_ndktest_MainActivity.h

 1 /* DO NOT EDIT THIS FILE - it is machine generated */
 2 #include <jni.h>
 3 /* Header for class com_example_ndktest_MainActivity */
 4 
 5 #ifndef _Included_com_example_ndktest_MainActivity
 6 #define _Included_com_example_ndktest_MainActivity
 7 #ifdef __cplusplus
 8 extern "C" {
 9 #endif
10 /*
11  * Class:     com_example_ndktest_MainActivity
12  * Method:    printJNI
13  * Signature: (Ljava/lang/String;)Ljava/lang/String;
14  */
15 JNIEXPORT jstring JNICALL Java_com_example_ndktest_MainActivity_printJNI
16   (JNIEnv *, jobject, jstring);
17 
18 #ifdef __cplusplus
19 }
20 #endif
21 #endif

ndktest.cpp

#include <jni.h>
#include <string.h>

#include "com_example_ndktest_MainActivity.h"

JNIEXPORT jstring JNICALL Java_com_example_ndktest_MainActivity_printJNI
                      (JNIEnv *env, jobject thiz, jstring str)
{
    return env->NewStringUTF("Hello from JNI from bear !");
}

Android.mk

1 LOCAL_PATH := $(call my-dir)
2 
3 include $(CLEAR_VARS)
4 
5 LOCAL_MODULE    := ndktest
6 LOCAL_SRC_FILES := ndktest.cpp
7 
8 include $(BUILD_SHARED_LIBRARY)

6. 最後clean一下工程,自動編譯,eclipse會調用ndk去編譯生成最終的動態庫文件,如libndktest.so,並自動打包到

apk裏面。

7. 安裝生成的apk,能夠在logcat裏面看到來自jni的log內容。觀察app的安裝目錄,能夠發現最終生成的so庫文件是存放在了

root@degasveltechn:/data/data/com.example.ndktest #ll

drwxrwx--x u0_a146  u0_a146           2015-10-04 20:57 cache
lrwxrwxrwx install  install           2015-10-04 20:59 lib -> /data/app-lib/com.example.ndktest-2

庫是統一安裝到/data/app-lib目錄下面的,/data/data/app-name下放的是一個link文件。

相關文章
相關標籤/搜索