1. 程式人生 > >android studio下ndk C++開發

android studio下ndk C++開發

1、下載NDK(Native Develop Kit)交叉編譯工具,解壓NDK開發工具集,隨便哪裡都行,看你自己的習慣,但是還是要自己知道,別什麼時候不知不覺刪了,然後開發JNI始終不行,怎麼都找不到錯誤,那就杯具了。
2、在 local.properties 檔案中設定ndk的路徑:
ndk.dir=D:\android\android-ndk-r10d
(我的nkd的解壓路徑:D:\android\android-ndk-r10d)
3、標頭檔案生成:
\\\1、建一個平時一樣的android工程
\\\2、在需要呼叫C++函式的地方宣告本地方法


public
class MainActivity extends Activity { static { System.loadLibrary("hello");//載入交叉編譯生成的模組,編譯方法見後邊 } public native String hello();//navive標示是本地方法 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView textView = (TextView)findViewById(R.id.show); textView.setText(hello()); } }

\\\3、make project 一下,目的是生成class檔案,我的專案生成後的路徑:
(a)、D:\android\project\NDKDemo\app\build\intermediates\classes\debug\com\example\administrator\ndkdemo
ndkdemo是的工程名
此步驟的目的是為了用javah命令生成本地方法的標頭檔案(注:該標頭檔案沒多大用處,就是一會寫原始檔.cpp的時候方便點,直接把.h檔案的內容拷貝過來,把函式體寫一下就好了)
===========================================
(b)、開啟android studio 的terminal:

javah -d jni -classpath D:\android\sdk\platforms\android-16\android.jar;D:\android\sdk\extras\android\support\v7\appcompat\libs\android-support-v7-appcompat.jar;D:\android\sdk\extras\android\support\v4\android-support-v4.jar;..\..\build\intermediates\classes\debug com.example.administrator.ndklog.MainActivity

最後一個引數MainActivity就是前邊make project那步生成的.class檔案。
注意:該命令是在工程檔案下app\src\main下執行的,這樣執行完畢後,在main檔案下就生成了jni檔案,裡邊包含生成的.h檔案。
如圖:這裡寫圖片描述

4、在jni下建立.cpp原始檔main.cpp
這裡寫圖片描述

//
// Created by Administrator on 2015/11/7.
//

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_administrator_ndkdemo_MainActivity */

#ifndef _Included_com_example_administrator_ndkdemo_MainActivity
#define _Included_com_example_administrator_ndkdemo_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
#undef com_example_administrator_ndkdemo_MainActivity_MODE_PRIVATE
#define com_example_administrator_ndkdemo_MainActivity_MODE_PRIVATE 0L
#undef com_example_administrator_ndkdemo_MainActivity_MODE_WORLD_READABLE
#define com_example_administrator_ndkdemo_MainActivity_MODE_WORLD_READABLE 1L
#undef com_example_administrator_ndkdemo_MainActivity_MODE_WORLD_WRITEABLE
#define com_example_administrator_ndkdemo_MainActivity_MODE_WORLD_WRITEABLE 2L
#undef com_example_administrator_ndkdemo_MainActivity_MODE_APPEND
#define com_example_administrator_ndkdemo_MainActivity_MODE_APPEND 32768L
#undef com_example_administrator_ndkdemo_MainActivity_MODE_MULTI_PROCESS
#define com_example_administrator_ndkdemo_MainActivity_MODE_MULTI_PROCESS 4L
#undef com_example_administrator_ndkdemo_MainActivity_MODE_ENABLE_WRITE_AHEAD_LOGGING
#define com_example_administrator_ndkdemo_MainActivity_MODE_ENABLE_WRITE_AHEAD_LOGGING 8L
#undef com_example_administrator_ndkdemo_MainActivity_BIND_AUTO_CREATE
#define com_example_administrator_ndkdemo_MainActivity_BIND_AUTO_CREATE 1L
#undef com_example_administrator_ndkdemo_MainActivity_BIND_DEBUG_UNBIND
#define com_example_administrator_ndkdemo_MainActivity_BIND_DEBUG_UNBIND 2L
#undef com_example_administrator_ndkdemo_MainActivity_BIND_NOT_FOREGROUND
#define com_example_administrator_ndkdemo_MainActivity_BIND_NOT_FOREGROUND 4L
#undef com_example_administrator_ndkdemo_MainActivity_BIND_ABOVE_CLIENT
#define com_example_administrator_ndkdemo_MainActivity_BIND_ABOVE_CLIENT 8L
#undef com_example_administrator_ndkdemo_MainActivity_BIND_ALLOW_OOM_MANAGEMENT
#define com_example_administrator_ndkdemo_MainActivity_BIND_ALLOW_OOM_MANAGEMENT 16L
#undef com_example_administrator_ndkdemo_MainActivity_BIND_WAIVE_PRIORITY
#define com_example_administrator_ndkdemo_MainActivity_BIND_WAIVE_PRIORITY 32L
#undef com_example_administrator_ndkdemo_MainActivity_BIND_IMPORTANT
#define com_example_administrator_ndkdemo_MainActivity_BIND_IMPORTANT 64L
#undef com_example_administrator_ndkdemo_MainActivity_BIND_ADJUST_WITH_ACTIVITY
#define com_example_administrator_ndkdemo_MainActivity_BIND_ADJUST_WITH_ACTIVITY 128L
#undef com_example_administrator_ndkdemo_MainActivity_CONTEXT_INCLUDE_CODE
#define com_example_administrator_ndkdemo_MainActivity_CONTEXT_INCLUDE_CODE 1L
#undef com_example_administrator_ndkdemo_MainActivity_CONTEXT_IGNORE_SECURITY
#define com_example_administrator_ndkdemo_MainActivity_CONTEXT_IGNORE_SECURITY 2L
#undef com_example_administrator_ndkdemo_MainActivity_CONTEXT_RESTRICTED
#define com_example_administrator_ndkdemo_MainActivity_CONTEXT_RESTRICTED 4L
#undef com_example_administrator_ndkdemo_MainActivity_RESULT_CANCELED
#define com_example_administrator_ndkdemo_MainActivity_RESULT_CANCELED 0L
#undef com_example_administrator_ndkdemo_MainActivity_RESULT_OK
#define com_example_administrator_ndkdemo_MainActivity_RESULT_OK -1L
#undef com_example_administrator_ndkdemo_MainActivity_RESULT_FIRST_USER
#define com_example_administrator_ndkdemo_MainActivity_RESULT_FIRST_USER 1L
#undef com_example_administrator_ndkdemo_MainActivity_DEFAULT_KEYS_DISABLE
#define com_example_administrator_ndkdemo_MainActivity_DEFAULT_KEYS_DISABLE 0L
#undef com_example_administrator_ndkdemo_MainActivity_DEFAULT_KEYS_DIALER
#define com_example_administrator_ndkdemo_MainActivity_DEFAULT_KEYS_DIALER 1L
#undef com_example_administrator_ndkdemo_MainActivity_DEFAULT_KEYS_SHORTCUT
#define com_example_administrator_ndkdemo_MainActivity_DEFAULT_KEYS_SHORTCUT 2L
#undef com_example_administrator_ndkdemo_MainActivity_DEFAULT_KEYS_SEARCH_LOCAL
#define com_example_administrator_ndkdemo_MainActivity_DEFAULT_KEYS_SEARCH_LOCAL 3L
#undef com_example_administrator_ndkdemo_MainActivity_DEFAULT_KEYS_SEARCH_GLOBAL
#define com_example_administrator_ndkdemo_MainActivity_DEFAULT_KEYS_SEARCH_GLOBAL 4L
/*
 * Class:     com_example_administrator_ndkdemo_MainActivity
 * Method:    hello
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_administrator_ndkdemo_MainActivity_hello
        (JNIEnv * env, jobject obj)
{
    return env->NewStringUTF("Hello Jni---->C++!");
}

#ifdef __cplusplus
}
#endif
#endif


5、gradle配置
開啟build.gradle(Module:app)
在defaultConfig中新增:

ndk {
            moduleName "hello"
            ldLibs "log","z","m"
            abiFilters "armeabi","armeabi-v7a","x86"
        }

此處生成的moduleName就是上邊java程式碼中System.loadLibrary(“hello”);對應的名字

在gradle.properties中新增:

android.useDeprecatedNdk=true

最後一點不理解的是要在jni下隨便建一個.cpp檔案專案才能正確編譯。
編譯成功後在:
D:\android\project\NDKDemo\app\build\intermediates\ndk\debug
可以看到生成.so庫。Android.mk檔案也在該目錄下,在eclipse專案中,NDK開發需要自己配置該檔案,在android studio中會自動生成,自動生成,自動生成,重要的事情說三遍。