在Android studio中進行NDK開發

分類: Android平臺html

 

軟硬件環境

  • ubuntu kylin 14.04
  • 紅米note加強版
  • Android studio 0.8.6
  • ndk r10c

前言

本文的目標是在Android studio中進行NDK的開發。示例是在main activity中顯示一個字符串,而字符串的內容是來自於一個C函數。歸結於一句話:NDK是爲了讓上層的java應用可以調用底層的c/c++而設計的。立刻進入主題。java

建立工程

建立一個名爲jniDemo的blank activity工程,activity名爲MyActivity,在MyActivity類的最後聲明一個方法,這個方法會在C函數中去實現,以下圖所示,android

drawing

jni部分

設置ndk路徑,打開local.properties,增長c++

ndk.dir=/home/djstava/Workshop/Android/android-studio/ndk 

點擊android studio左下角的Terminalgit

cd src/main

javah -d jni -classpath ~/Workshop/Android/android-studio/sdk/platforms/android-4.4.2/android.jar:../../build/intermediates/classes/debug/ com.example.djstava.jnidemo.MyActivity 

參數意義:github

-d 輸出目錄,jni是gradle默認的路徑    
-classpath jar的路徑,常常碰到的找不到activity的類的錯誤通常是由這個引發的    
com.example.djstava.jnidemo.MyActivity 包名+activity 

這條命令執行完畢後,會在src/main下生成jni目錄,併產生頭文件com_example_djstava_jnidemo_MyActivity.h,其內容爲ubuntu

/* DO NOT EDIT THIS FILE - it is machine generated */
#include 
/* Header for class com_example_djstava_jnidemo_MyActivity */

#ifndef _Included_com_example_djstava_jnidemo_MyActivity
#define _Included_com_example_djstava_jnidemo_MyActivity
#ifdef __cplusplus
extern "C" {
#endif
#undef com_example_djstava_jnidemo_MyActivity_MODE_PRIVATE
#define com_example_djstava_jnidemo_MyActivity_MODE_PRIVATE 0L
#undef com_example_djstava_jnidemo_MyActivity_MODE_WORLD_READABLE
#define com_example_djstava_jnidemo_MyActivity_MODE_WORLD_READABLE 1L
#undef com_example_djstava_jnidemo_MyActivity_MODE_WORLD_WRITEABLE
#define com_example_djstava_jnidemo_MyActivity_MODE_WORLD_WRITEABLE 2L
#undef com_example_djstava_jnidemo_MyActivity_MODE_APPEND
#define com_example_djstava_jnidemo_MyActivity_MODE_APPEND 32768L
#undef com_example_djstava_jnidemo_MyActivity_MODE_MULTI_PROCESS
#define com_example_djstava_jnidemo_MyActivity_MODE_MULTI_PROCESS 4L
#undef com_example_djstava_jnidemo_MyActivity_MODE_ENABLE_WRITE_AHEAD_LOGGING
#define com_example_djstava_jnidemo_MyActivity_MODE_ENABLE_WRITE_AHEAD_LOGGING 8L
#undef com_example_djstava_jnidemo_MyActivity_BIND_AUTO_CREATE
#define com_example_djstava_jnidemo_MyActivity_BIND_AUTO_CREATE 1L
#undef com_example_djstava_jnidemo_MyActivity_BIND_DEBUG_UNBIND
#define com_example_djstava_jnidemo_MyActivity_BIND_DEBUG_UNBIND 2L
#undef com_example_djstava_jnidemo_MyActivity_BIND_NOT_FOREGROUND
#define com_example_djstava_jnidemo_MyActivity_BIND_NOT_FOREGROUND 4L
#undef com_example_djstava_jnidemo_MyActivity_BIND_ABOVE_CLIENT
#define com_example_djstava_jnidemo_MyActivity_BIND_ABOVE_CLIENT 8L
#undef com_example_djstava_jnidemo_MyActivity_BIND_ALLOW_OOM_MANAGEMENT
#define com_example_djstava_jnidemo_MyActivity_BIND_ALLOW_OOM_MANAGEMENT 16L
#undef com_example_djstava_jnidemo_MyActivity_BIND_WAIVE_PRIORITY
#define com_example_djstava_jnidemo_MyActivity_BIND_WAIVE_PRIORITY 32L
#undef com_example_djstava_jnidemo_MyActivity_BIND_IMPORTANT
#define com_example_djstava_jnidemo_MyActivity_BIND_IMPORTANT 64L
#undef com_example_djstava_jnidemo_MyActivity_BIND_ADJUST_WITH_ACTIVITY
#define com_example_djstava_jnidemo_MyActivity_BIND_ADJUST_WITH_ACTIVITY 128L
#undef com_example_djstava_jnidemo_MyActivity_CONTEXT_INCLUDE_CODE
#define com_example_djstava_jnidemo_MyActivity_CONTEXT_INCLUDE_CODE 1L
#undef com_example_djstava_jnidemo_MyActivity_CONTEXT_IGNORE_SECURITY
#define com_example_djstava_jnidemo_MyActivity_CONTEXT_IGNORE_SECURITY 2L
#undef com_example_djstava_jnidemo_MyActivity_CONTEXT_RESTRICTED
#define com_example_djstava_jnidemo_MyActivity_CONTEXT_RESTRICTED 4L
#undef com_example_djstava_jnidemo_MyActivity_RESULT_CANCELED
#define com_example_djstava_jnidemo_MyActivity_RESULT_CANCELED 0L
#undef com_example_djstava_jnidemo_MyActivity_RESULT_OK
#define com_example_djstava_jnidemo_MyActivity_RESULT_OK -1L
#undef com_example_djstava_jnidemo_MyActivity_RESULT_FIRST_USER
#define com_example_djstava_jnidemo_MyActivity_RESULT_FIRST_USER 1L
#undef com_example_djstava_jnidemo_MyActivity_DEFAULT_KEYS_DISABLE
#define com_example_djstava_jnidemo_MyActivity_DEFAULT_KEYS_DISABLE 0L
#undef com_example_djstava_jnidemo_MyActivity_DEFAULT_KEYS_DIALER
#define com_example_djstava_jnidemo_MyActivity_DEFAULT_KEYS_DIALER 1L
#undef com_example_djstava_jnidemo_MyActivity_DEFAULT_KEYS_SHORTCUT
#define com_example_djstava_jnidemo_MyActivity_DEFAULT_KEYS_SHORTCUT 2L
#undef com_example_djstava_jnidemo_MyActivity_DEFAULT_KEYS_SEARCH_LOCAL
#define com_example_djstava_jnidemo_MyActivity_DEFAULT_KEYS_SEARCH_LOCAL 3L
#undef com_example_djstava_jnidemo_MyActivity_DEFAULT_KEYS_SEARCH_GLOBAL
#define com_example_djstava_jnidemo_MyActivity_DEFAULT_KEYS_SEARCH_GLOBAL 4L
/*
* Class:     com_example_djstava_jnidemo_MyActivity
* Method:    getStringFromJNI
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_djstava_jnidemo_MyActivity_getStringFromJNI
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif 

根據產生的頭文件,在同級目錄建立C源文件,內容以下android-studio

/* DO NOT EDIT THIS FILE - it is machine generated */
#include 
/* Header for class com_example_djstava_jnidemo_MyActivity */

/*
* Class:     com_example_djstava_jnidemo_MyActivity
* Method:    getStringFromJNI
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_djstava_jnidemo_MyActivity_getStringFromJNI
(JNIEnv *env, jobject obj)
{
    return (*env)->NewStringUTF(env,"Hello android from jni!");
} 

gradle配置

打開build.gradle,在defaultConfig設置項內添加app

ndk {
    moduleName "jniLib" //這是模塊名稱,在加載時會被用到
} 

在defaultConfig設置項後面添加ide

flavorGroups "abi"

productFlavors {
    x86 {
        ndk {
            abiFilter "x86"
        }
    }
    arm {
        ndk {
            abiFilter "armeabi-v7a"
        }
    }
    mips {
        ndk {
            abiFilter "mips"
        }
    }
} 

在MyActivity中加載jni模塊,以下圖所示,要去掉前綴lib和後綴.so

drawing

修改activity_my.xml

添加textView的id

android:id="@+id/jni_text" 

測試

不出意外的話,你的app的textView上會出現"Hello android from jni!"。生成的庫位於app/build/intermediates/ndk/arm/debug/lib/armeabi-v7a/libjniLib.so,Makefile文件位於/home/djstava/AndroidstudioProjects/jniDemo/app/build/intermediates/ndk/arm/debug/Android.mk,apk文件位於/home/djstava/AndroidstudioProjects/jniDemo/app/build/outputs/apk,固然這些文件的生成都是在studio裏作的,對用戶是透明的。

drawing

參考資料

一、https://developer.android.com/tools/sdk/ndk/index.html
二、https://www.youtube.com/watch?v=okLKfxfbz40
三、http://www.shaneenishry.com/blog/2014/08/17/ndk-with-android-studio/
四、https://software.intel.com/en-us/videos/using-the-ndk-with-android-studio
五、https://www.youtube.com/watch?v=e54f6dt9OZo&feature=youtube_gdata

相關文章
相關標籤/搜索