轉:http://www.2cto.com/kf/201412/361768.htmlhtml
使用Android Sutdio建立一個新的工程後,接下來記錄建立NDK工程的基本步驟。 本文將達到:java
1. 建立NDK工程android
2. 在JNI中輸出Log語句windows
3. 指定編譯的so庫的abi版本app
4. 解決在建立NDK工程中的問題ide
Step: 1. 添加native接口注意寫好native接口和System.loadLibrary()便可了,並沒有特別之處工具
。P.S:onCreate()中對R.id.txt執行setText(),因此這裏須要對xml佈局文件按正常的開發步驟進行修改便可。 直接給出代碼以下:佈局
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public
class
MainActivity
extends
Activity{
static
{
System.loadLibrary(
"JniTest"
);
}
public
native
String getStringFromNative();
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView txtView = (TextView) findViewById(R.id.txt);
txtView.setText(getStringFromNative());
}
}
|
Step: 2.執行Build->Make Projectgradle
這一步驟執行一下,驗證工程中並沒有其它錯誤,並對工程進行了編譯,生成了.class文件..class文件的生成路徑是在 app_path/build/intermediates/classes/debug下的.以下圖:ui
Step: 3.javah生成c頭文件
點擊"View->Tool Windows->Terminal",即在Studio中進行終端命令行工具.執行以下命令生成c語言頭文件。這裏須要注意的是要進入 \app\src\main的目錄下執行javah命令,爲的是生成的 .h 文件一樣是在\app\src\main路徑下,能夠在Studio的工程結構中直接看到。 操做命令:javah -d jni -classpath <sdk_android.jar>;<app_classes> lab.sodino.jnitest.MainActivity具體操做圖以下:
1
2
|
javah -d jni -classpath c:\Users\sodinochen\AppData\Local\Android\sdk\platforms
\android-
16
\android.jar;..\..\build\intermediates\classes\debug lab.sodino.jnitest.MainActivity
|
對於"主版本51比50新,此編譯器支持最新的主版本"則是因爲電腦上安裝了兩個版本的jdk引發的,而當前使用的是舊的jdk。把舊的jdk刪除,並執行java version命令後顯示當前jdk爲最新的1.7時,則不會再有此提示了。以下圖:
最後的生成結果: <喎�"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD48cD48aW1nIHNyYz0="http://www.2cto.com/uploadfile/Collfiles/20141216/2014121608565552.png" alt="\" />
Step: 4.編輯c文件
在main.c文件中實現頭文件中的方法,具體功能爲直接return回一個String,而且使用android_log打印出相關日誌。代碼以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
#include
#ifndef LOG_TAG
#define LOG_TAG
"ANDROID_LAB"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
#endif
/* Header for class lab_sodino_jnitest_MainActivity */
#ifndef _Included_lab_sodino_jnitest_MainActivity
#define _Included_lab_sodino_jnitest_MainActivity
#ifdef __cplusplus
extern
"C"
{
#endif
/*
* Class: lab_sodino_jnitest_MainActivity
* Method: getStringFromNative
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_lab_sodino_jnitest_MainActivity_getStringFromNative
(JNIEnv * env, jobject jObj){
LOGE(
"log string from ndk."
);
return
(*env)->NewStringUTF(env,
"Hello From JNI!"
);
}
#ifdef __cplusplus
}
#endif
#endif
</android></jni.h>
|
到這裏後,咱們再執行一個"Build->Make Project",發現"Messages Gradle Build"會給出提示以下:
1
2
3
4
|
Error:Execution failed
for
task
':app:compileDebugNdk'
.
> NDK not configured.
Download the NDK from http:
//developer.android.com/tools/sdk/ndk/.Then add ndk.dir=path/to/ndk in local.properties.
(On Windows, make sure you escape backslashes, e.g. C:\\ndk rather than C:\ndk)
|
這裏提示了NDK未配置,而且須要在工程中的local.properties文件中配置NDK路徑。好了,提示很清楚了,那咱們就進入下一步吧。
Step: 5.配置NDK這一步包括兩個動做:
1.指明ndk路徑
2. 修改build.gradle配置 工程中共有兩個build.gradle配置文件,咱們要修改的是在\app\build.gradle這個文件。爲其在defaultConfig分支中增長上
1
2
3
4
5
|
ndk {
moduleName
"JniTest"
ldLibs
"log"
,
"z"
,
"m"
abiFilters
"armeabi"
,
"armeabi-v7a"
,
"x86"
}
|
以上配置代碼指定的so庫名稱爲JniTest,連接時使用到的庫,對應android.mk文件中的LOCAL_LDLIBS,及最終輸出指定三種abi體系結構下的so庫。添加後以下圖:
這時,再執行"Build->Rebuild Project",就能夠編譯出so文件了。但在Window平臺上會出現一個問題:
1
2
3
4
5
6
7
|
Error:Execution failed
for
task
':app:compileDebugNdk'
.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
D:\Mission\adt-bundle-windows\ndk-r10b\ndk-build.cmd NDK_PROJECT_PATH=
null
APP_BUILD_SCRIPT=C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\Android.mk APP_PLATFORM=android-
21
NDK_OUT=C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\obj NDK_LIBS_OUT=C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\lib APP_ABI=armeabi,armeabi-v7a,x86
Error Code:
2
Output:
make.exe: *** No rule to make target `C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\obj/local/armeabi/objs/JniTest/C_\Users\sodinochen\AndroidstudioProjects\JniTest2\app\src\main\jni
', needed by `C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\obj/local/armeabi/objs/JniTest/C_\Users\sodinochen\AndroidstudioProjects\JniTest2\app\src\main\jni\main.o'
. Stop.
|
出現這個錯誤很莫名其妙..幾番折騰下,找到一個視頻出來了大概緣由及解決方式:出處見Youtube視頻 02:50分開始:https://www.youtube.com/watch?v=okLKfxfbz40#t=362在Windows下NDK一個bug,當僅僅編譯一個文件時出現會出現此問題,解決方法就是再加入一個空util.c文件便可。編譯出來的庫文件被Studio輸出到了下圖的路徑中
Step: 6.安裝運行
界面:
查看Log打印: