android 之ndk開發
1、Android NDK簡介
NDK全稱為native development kit本地語言(C&C++)開發包。而對應的是經常接觸的Android-SDK,(software development kit)軟件開發包(隻支持java語言開發)。
簡單來說利用NDK,可以開發純C&C++的代碼,然後編譯成庫,讓利用Android-SDK開發的Java程序調用。NDK開發的可以稱之為底層開發或者jni(java native interface)層開發,SDK開發可以稱為上層開發。
2、為何要用NDK
2.1、眾所周知,利用SDK編寫的代碼,生成的APK,很容易就可以反編譯了,安全性極為不高,而利用NDK開發的庫,不容易被反編譯,保密性,安全性都提高了。
2.2、很多開源工程和大型工程都是C&C++代碼,把它們轉換為純java語言顯然是不可能的。
2.3、C&C++的代碼運行速度和效率都比java快很多。
3、NDK環境的搭建
在https://developer.android.com/sdk/ndk/index.html下載最新版的NDK,然後解壓到你喜歡的位置,然後把NDK的所在的目錄,配置到環境變量裏麵就行。
如我在windows下麵用cygwin開發。配置環境變量可以參考https://blog.csdn.net/conowen/article/details/7518870
簡單來說就是在linux或者cygwin的安裝目錄,跳轉到/home/YourName/,然後編輯.bash_profile文件,在末尾添加如下語句,具體根據自己的情況而定。
- ndk=/home/conowen/android-ndk-r7b
- export ndk
4、新建一個NDK工程
新建一個目錄,命名為HelloWorld,然後在裏麵新建一個名為jni的目錄(名稱一定要是jni,因為ndk-build的時候會在HelloWorld目錄下尋找jni的目錄,然後進行build),在jni目錄下新建如下文件HelloWorld.c和Android.mk。
HelloWorld.c文件代碼如下(此JNI是沒有jni_onLoad函數的)
- #include <string.h>
- #include <jni.h>
- jstring
- Java_com_conowen_helloworld_HelloWorldActivity_helloWorldFromJNI( JNIEnv* env,
- jobject thiz )
- {
- return (*env)->NewStringUTF(env, "HelloWorld! I am from JNI !");
- }
- /*注意,這裏
- jstring 表示返回值
- Java_com_conowen_helloworld_HelloWorldActivity_helloWorldFromJNI
- 寫法是Java+Android工程的包名+Android工程的Activity名+方法名,點號用下劃線表示,這個寫法很嚴格。
- 包名:com_conowen_helloworld
- Activity名:HelloWorldActivity
- 方法名:helloWorldFromJNI
- JNIEnv* env, jobject thiz是Native方法自帶的參數,可以用來轉換一個數據類型。也就是說其實這個helloWorldFromJNI是沒有形參的。
- */
Android.mk代碼如下
關於Android.mk的編寫格式,下一篇博文補全
- LOCAL_PATH := $(call my-dir)
- include $(CLEAR_VARS)
- #LOCAL_MODULE表示生成的庫的名字,前麵的lib和後綴名不用寫
- LOCAL_MODULE := HelloWorld
- LOCAL_SRC_FILES := HelloWorld.c
- include $(BUILD_SHARED_LIBRARY)
然後在終端裏麵,轉到HelloWorld目錄下,執行
- $ndk/ndk-build
5、新建一個Android工程
在eclipse裏麵新建一個Android工程,java代碼如下,然後把剛剛生成的libs文件夾拖到Android工程目錄下。
- package com.conowen.helloworld;
- import android.app.Activity;
- import android.os.Bundle;
- import android.widget.TextView;
- public class HelloWorldActivity extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- TextView tv = new TextView(this);
- tv.setText(helloWorldFromJNI());
- setContentView(tv);
- }
- public native String helloWorldFromJNI();// native聲明,表示這個方法來自Native層。實現過程已經在native層實現了
- static {
- System.loadLibrary("HelloWorld");// 加載庫,前麵的lib和,後綴名不用寫
- }
- }
效果圖:
最後更新:2017-04-03 12:54:49
上一篇:
xmpp即時通訊詳解
下一篇:
xmpp即時通訊詳解
從項目命名看業務架構發展
spring裏頭各種獲取ApplicationContext的方法
《Docker容器:利用Kubernetes、Flannel、Cockpit和Atomic構建和部署》——第1章 使用Docker對應用進行容器化 1.1了解容器化應用的優缺點
app軟件開發功能流程
Split遇到“.”點注意點
jlink燒寫Nor Flash時出錯正確解決方法匯總:PC of target system has unexpected value after programming
Cocos2d-x多場景切換生命周期
OSS細粒度的權限控製
Java設計模式:觀察者
android 理解和使用自定義權限