編輯:關於Android編程
Android平台是基於java實現,運行於虛擬機Dalvik;故而使用Android SDK創建應用程序需要使用java語言來編寫實現。不過並不僅限於使用java,google在發布android之初就宣稱支持持JNI編程方式,也就是第三方應用完全可以通過JNI調用自己的C動態庫,即在Android平台上,“Java+C”的編程方式是一直都可以實現的。NDK即為了方便你創建應用時調用本地C/C++的一系列工具集合。
The NDK is a toolset that allows you to implement parts of your app using native-code languages such as C and C++. For certain types of apps, this can be helpful so you can reuse existing code libraries written in these languages, but most apps do not need the Android NDK.
官方NDK文檔:http://wear.techbrood.com/tools/sdk/ndk/
Before downloading the NDK, you should understand that the NDK will not benefit most apps. As a developer, you need to balance its benefits against its drawbacks. Notably, using native code on Android generally does not result in a noticable performance improvement, but it always increases your app complexity. In general, you should only use the NDK if it is essential to your app—never because you simply prefer to program in C/C++.
官方清楚的描述了大部分應用並不會因為使用NDK而獲得明顯的性能收益,反而有可能導致應用的復雜度增加,兼容性變差等。Google建議在需要在處理需要大量計算/高CPU消耗的工作時使用NDK來提高運算處理效率,例如:游戲引擎、信號處理、圖像處理等。
而實際使用NDK時往往還會考慮到:
1. 代碼的保護,由於apk的java層代碼很容易被反編譯,而C/C++庫反匯難度較大。
2. 為了方便地使用現存的開源庫,大部分現存的開源庫都是用C/C++代碼編寫的。
3. 跨平台考慮,用C/C++寫得庫可以方便在其他的嵌入式平台上再次使用。
使用NDK,當然要先下載最新NDK工具:http://developer.android.com/ndk/downloads/index.html
配置項目的NDK路徑:
查看local.prZ喎?/kf/ware/vc/" target="_blank" class="keylink">vcGVydGllc8rHt/G2qNLlusNOREvCt762o7o8YnIgLz4NCjxpbWcgYWx0PQ=="這裡寫圖片描述" src="/uploadfile/Collfiles/20160401/20160401094559422.png" title="\" />
Project Gradle NDK配置
更改project的gradle.properties文件,加入android.useDeprecatedNdk=true,使得項目支持NDK:
修改app下build.gradle的defaultConfig,配置native c/c++編譯本地so庫:
申明JNI函數,在java代碼內編寫需要實現JNI的native函數:
package com.example.jokerlee.myapplication;
/**
* Created by jokerlee on 16-3-31.
*/
public class JniTest {
//使用jni需要加載本地編譯出來的so庫,名稱即為上一步配置的ndk moduleName
static {
System.loadLibrary("jniTest");
}
public static native String getStringFromJni();
}
Rebuild Project之後NDK工具會在app的build/intermediates目錄下產生一個classses文件夾:
打開AS的terminal執行使用javah命令將java class聲明的JNI方法轉化成C\C++頭文件
關於javah命令詳解可參考:http://blog.csdn.net/zzhays/article/details/10514767
在當前debug目錄生成com_example_jokerlee_myapplication_JniTest.h:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class com_example_jokerlee_myapplication_JniTest */
#ifndef _Included_com_example_jokerlee_myapplication_JniTest
#define _Included_com_example_jokerlee_myapplication_JniTest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_jokerlee_myapplication_JniTest
* Method: getStringFromJni
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_jokerlee_myapplication_JniTest_getStringFromJni
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
然後就是根據該頭文件創建c/cpp文件TestJni.cpp實現頭文件中的函數聲明,並將這些頭文件和c/cpp文件移動到main/src目錄下:
//
// Created by jokerlee on 16-3-31.
//
#include "com_example_jokerlee_myapplication_JniTest.h"
JNIEXPORT jstring JNICALL Java_com_example_jokerlee_myapplication_JniTest_getStringFromJni
(JNIEnv * env, jclass ){
return env->NewStringUTF("這裡是來自c的string");
}
前面完成各種配置以及c/c++文件的編寫之後,在應用內若需要實現JNI調用native函數,則需要先加載native code編譯出來的so庫:
//jniTest為庫的名稱,即為配置在app build.gradle defaultConfig的moduleName
System.loadLibrary("jniTest");
package com.example.jokerlee.myapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("test", JniTest.getStringFromJni() );
}
}
一、概述在之前一個項目中,因為涉及到數據庫,所以就接觸到了ORM框架的GreenDao。後面就去網上大量的搜索下載學習,發現很多都是官網的翻譯或者是官網DEMO的簡單入門
Android 高德地圖 java.lang.UnsatisfiedlinkError Native method not found: com.autonavi.ama
我們學習了一些Android數據庫相關的基礎知識,和幾個頗為有用的SQLite命令,都是直接在命令行操作的。但是我們都知道,數據庫是要和程序結合在一起使用的,
最近的項目中遇到一個非常頭痛的需求,在Android端錄制視頻的時候動態添加像監控畫面一樣的精確到秒的時間信息,關鍵是,並不是說只在播放器的界面顯示時間就可以了,而是錄制