Android NDK開發的環境搭建與簡單樣本_Android

來源:互聯網
上載者:User

一、NDK與JNI簡介

NDK全稱為native development kit本地語言(C&C++)開發包。而對應的是經常接觸的Android-SDK,(software development kit)軟體開發包(只支援java語言開發)。

簡單來說利用NDK,可以開發純C&C++的代碼,然後編譯成庫,讓利用Android-SDK開發的Java程式調用。NDK開發的可以稱之為底層開發或者jni(java native interface)層開發,SDK開發可以稱為上層開發。

Android開發中使用NDK的原因:

1、眾所周知,利用SDK編寫的代碼,產生的APK,很容易就可以反編譯了,安全性極為不高,而利用NDK開發的庫,不容易被反編譯,保密性,安全性都提高了。

2、很多開源工程和大型工程都是C&C++代碼,把它們轉換為純java語言顯然是不可能的。

3、C&C++的代碼運行速度和效率都比java快很多。

JNI全稱為Java Native Interface(JAVA本地調用)。從Java1.1開始,JNI成為java平台的一部分,它允許Java代碼和其他語言寫的代碼(如C&C++)進行互動。並非從Android發布才引入JNI的概念的。

簡單來說,Android的NDK提供了一些交叉編譯工具鏈和Android內建的庫,這些Android的庫可以讓開發人員在編寫本地語言的程式時調用。而NDK提供的交叉編譯工具鏈就對已經編寫好的C&C++代碼進行編譯,產生庫。當然了,你也可以自己搭建交叉編譯環境,而不用NDK的工具和庫。然後產生庫,只要規範操作,一樣可以產生能讓JAVA層成功調用的庫檔案的。

二、NDK環境搭建

使用最新NDK,直接拋棄cygwin,以前做Android的項目要用到NDK就必須要下載NDK,下載安裝Cygwin(類比Linux環境用的),下載CDT(Eclipse C/C++開發外掛程式),還要配置編譯器,環境變數,特別麻煩,新版就不需要了。

下載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,設定NDK路徑,例如我的是F:android-ndk-r10e。建立一個Android工程NDKTest,在工程上右鍵點擊Android Tools->Add Native Support...,然後給我們的.so檔案取個名字(預設已經起好了,就是包名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>

繼續編寫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層。實現過程已經在native層實現了   static {    System.loadLibrary(NDKTest);// 載入庫,前面的lib和尾碼名不用寫  }}</span>

編譯運行,先編譯cpp檔案,右擊工程項目NDKTest,Build Project,成功結果在libs目錄下產生了.so檔案

然後編譯Android Java工程,右擊工程項目run application,部署到真機上的結果

三、相關問題

NDK搭建與執行個體過程中,遇到的一些問題如下:

Eclipse報錯“Unresolved inclusion jni.h”

在做NDK開發過程中有時候在eclipse裡會遇到其無法處理inclusion導致symbol顯示錯誤,網上有許多方法可以解決類似“Unresolved inclusion jni.h” 錯誤的方法,包括includepath等方法,不過對我都不管用。

最終的解決辦法就是初始化eclipse對該project的nativesupport:

1. 在eclipse中關閉指定Project

2. 用其他編輯工具開啟該project的.project檔案,刪除以下內容:

......

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開發中的Method 'NewStringUTF' could not be resolved問題

項目右鍵->屬性->c/c++常規->Code Analysis,選擇Use project settings 中的方法無法被解析(Method cannot be resolved)取消選擇,應用->確定,然後重新整理、清理、重新整理、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環境搭建及範例程式碼,做的整理,後續繼續補充相關資料謝謝大家對本站的支援!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.