Android NDK開發(fā)的環(huán)境搭建與簡單示例
一、NDK與JNI簡介
NDK全稱為native development kit本地語言(C&C++)開發(fā)包。而對應(yīng)的是經(jīng)常接觸的Android-SDK,(software development kit)軟件開發(fā)包(只支持java語言開發(fā))。
簡單來說利用NDK,可以開發(fā)純C&C++的代碼,然后編譯成庫,讓利用Android-SDK開發(fā)的Java程序調(diào)用。NDK開發(fā)的可以稱之為底層開發(fā)或者jni(java native interface)層開發(fā),SDK開發(fā)可以稱為上層開發(fā)。
Android開發(fā)中使用NDK的原因:
1、眾所周知,利用SDK編寫的代碼,生成的APK,很容易就可以反編譯了,安全性極為不高,而利用NDK開發(fā)的庫,不容易被反編譯,保密性,安全性都提高了。
2、很多開源工程和大型工程都是C&C++代碼,把它們轉(zhuǎn)換為純java語言顯然是不可能的。
3、C&C++的代碼運行速度和效率都比java快很多。
JNI全稱為Java Native Interface(JAVA本地調(diào)用)。從Java1.1開始,JNI成為java平臺的一部分,它允許Java代碼和其他語言寫的代碼(如C&C++)進行交互。并非從Android發(fā)布才引入JNI的概念的。
簡單來說,Android的NDK提供了一些交叉編譯工具鏈和Android自帶的庫,這些Android的庫可以讓開發(fā)者在編寫本地語言的程序時調(diào)用。而NDK提供的交叉編譯工具鏈就對已經(jīng)編寫好的C&C++代碼進行編譯,生成庫。當(dāng)然了,你也可以自己搭建交叉編譯環(huán)境,而不用NDK的工具和庫。然后生成庫,只要規(guī)范操作,一樣可以生成能讓JAVA層成功調(diào)用的庫文件的。
二、NDK環(huán)境搭建
使用最新NDK,直接拋棄cygwin,以前做Android的項目要用到NDK就必須要下載NDK,下載安裝Cygwin(模擬Linux環(huán)境用的),下載CDT(Eclipse C/C++開發(fā)插件),還要配置編譯器,環(huán)境變量,特別麻煩,新版就不需要了。
下載Android SDK http://developer.android.com/sdk/index.html
下載Android NDK http://developer.android.com/tools/sdk/ndk/index.html (注:NDK版本在r7以上之后就集成了Cygwin,而且還是十分精簡版。)
本人使用的SDK和NDK為

Eclipse配置
打開Eclipse,點Window->Preferences->Android->NDK,設(shè)置NDK路徑,例如我的是F:android-ndk-r10e。新建一個Android工程NDKTest,在工程上右鍵點擊Android Tools->Add Native Support...,然后給我們的.so文件取個名字(默認(rèn)已經(jīng)起好了,就是包名NDKTest)。這時候工程就會多一個jni的文件夾,jni下有Android.mk和NDKTest.cpp文件。Android.mk是NDK工程的Makefile,NDKTest.cpp就是NDK的源文件。

接下來編寫NDKTest.cpp文件
<span style="font-size:14px;">#include <jni.h>
#include <string.h>
extern C
jstring Java_com_example_ndktest_MainActivity_NDKTestFromJNI(JNIEnv* env,
jobject thiz) {
return env->NewStringUTF(Hello from JNI !);
}
</string.h></jni.h></span>
繼續(xù)編寫MainActivity.java文件
<span style="font-size:14px;">package com.example.ndktest;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
tv.setText(NDKTestFromJNI());
setContentView(tv);
}
public native String NDKTestFromJNI();// native聲明,表示這個方法來自Native層。實現(xiàn)過程已經(jīng)在native層實現(xiàn)了
static {
System.loadLibrary(NDKTest);// 加載庫,前面的lib和后綴名不用寫
}
}
</span>
編譯運行,先編譯cpp文件,右擊工程項目NDKTest,Build Project,成功結(jié)果在libs目錄下生成了.so文件


然后編譯Android Java工程,右擊工程項目run application,部署到真機上的結(jié)果

三、相關(guān)問題
NDK搭建與實例過程中,遇到的一些問題如下:
Eclipse報錯“Unresolved inclusion jni.h”
在做NDK開發(fā)過程中有時候在eclipse里會遇到其無法處理inclusion導(dǎo)致symbol顯示錯誤,網(wǎng)上有許多方法可以解決類似“Unresolved inclusion jni.h” 錯誤的方法,包括includepath等方法,不過對我都不管用。
最終的解決辦法就是初始化eclipse對該project的nativesupport:
1. 在eclipse中關(guān)閉指定Project
2. 用其他編輯工具打開該project的.project文件,刪除以下內(nèi)容:
......
org.eclipse.cdt.managedbuilder.core.genmakebuilder
clean,full,incremental,
......
org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder
full,incremental,
......
org.eclipse.cdt.core.cnature
org.eclipse.cdt.core.ccnature
org.eclipse.cdt.managedbuilder.core.managedBuildNature
org.eclipse.cdt.managedbuilder.core.ScannerConfigNature
3. 刪除.cproject文件
4. 在eclipse里打開原來的project, refresh,然后右鍵->properties->Android Tools -> Add Native Support
5. 搞定
window平臺下 Eclipse Ndk開發(fā)中的Method 'NewStringUTF' could not be resolved問題
項目右鍵->屬性->c/c++常規(guī)->Code Analysis,選擇Use project settings 中的方法無法被解析(Method cannot be resolved)取消選擇,應(yīng)用->確定,然后刷新、清理、刷新、build項目。
jni/hellocpp/main.cpp:16:18:error: base operand of '->' has non-pointer type 'JNIEnv {aka _JNIEnv}'
錯誤在于:
(*env)->NewStringUTF(env, Hello from JNI !);
這一行,這是c的寫法,而我的是cpp程序,需要改寫成:
env->NewStringUTF( Hello from JNI !);
java.lang.UnsatisfiedLinkError:Native method not found問題
1、c++中的方法Java_xxx_xxx中的Java 首字母一定要大寫
2、如果是 .cpp 文件則用 extern C {您的方法在這里},大括號里是您的本地方法。
以上就是對Android NDK環(huán)境搭建及示例代碼,做的整理,后續(xù)繼續(xù)補充相關(guān)資料謝謝大家對本站的支持!
相關(guān)文章
Android實現(xiàn)動態(tài)添加標(biāo)簽及其點擊事件
這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)動態(tài)添加標(biāo)簽及其點擊事件,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12
Android仿QQ復(fù)制昵稱效果的實現(xiàn)方法
這篇文章主要介紹了Android仿QQ復(fù)制昵稱效果的實現(xiàn)方法,主要依賴的是一個開源項目,需要的朋友可以參考下2019-05-05
Android文本框搜索和清空效果實現(xiàn)代碼及簡要概述
在工作過程中可能會遇到這樣一個效果:文本框輸入為空時顯示輸入的圖標(biāo);不為空時顯示清空的圖標(biāo),此時點擊清空圖標(biāo)能清空文本框內(nèi)輸入文字,感興趣的你可以了解下哦,或許對你學(xué)習(xí)android有所幫助2013-02-02
淺談Android獲取ImageView上的圖片,和一個有可能遇到的問題
下面小編就為大家?guī)硪黄獪\談Android獲取ImageView上的圖片,和一個有可能遇到的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04

