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中會自動生成,自動生成,自動生成,重要的事情說三遍。