❶ android ndk開發需要哪些
Android NDK是一個工具集,可以將本地代碼嵌入到你的Android 應用中。 Android 應用是在dalvik虛擬機中運行的。NDK可以讓你使用本地代碼語言來開發應用,比如說C/C++,這種方法對某些類型的應用的是有好處的,可以充分利用本地代碼和在某些情況下加速代碼的執行。 什麼時候用NDK? 對於絕大多數的應用來說,使用NDK並不是一個明智的選擇,作為一個開發者,我們需要衡量它所帶來的好處和缺點。使用本地代碼並不一定可以使性能得到優化,但是通常使得應用代碼變得復雜。一般來說,我們將應用中關鍵部分的代碼用C/C++寫,而不能由於我們習慣於用C/C++開發而把所有的代碼都用C/C++來實現。 有下面這些特點的應用可以考慮使用NDK: 1 獨立的,不和其他應用有關系的 2 頻繁佔用CPU但是申請的內存空間不是很大的操作,像信號的處理,物體的模擬等等 簡單的用C/C++重寫我們的代碼是不會帶來很大的性能提升的。 在考慮是否採用本地代碼開發的時候,要結合應用的實際需求並且看看Android 的framework層是否提供了我們需要的API,但是用NDK可以充分利用本地已經有的代碼。 Android framework提供下面兩種方法來使用本地代碼: 1 在Android framework的框架下面開發應用,使用JNI的方法來使用NDK本地方法提供的API。這樣的好處就是我們可以很好的利用的Android的framework提供的框架,但是需要編寫本地具體實現的代碼。這樣的APK可以在Android 1.5及其之後的版本上面運行。 2 寫一個本地的Activity,在本地代碼中實現生命回調函數,AndroidSDk提供了 NativeActivity類,這個類可以方便的讓你在你的本地代碼中實現回調函數(OnCreate,OnPause),從而當這些事件發生的時候處理。用本地類實現的應用可以在Android 2.3及其之後的版本上面運行。
❷ 關於Android NDK 開發方面的書籍有哪些推薦
推薦網上的兩篇tutorial,英文的,但是講的比較全面。
Mastering Android NDK Build System- Part 1: Techniques with ndk-build
Mastering Android NDK Build System- Part 2: Standalone toolchain
這兩篇介紹了怎樣編譯native程序。
然後再找一個介紹JNI的文章看一下,基本就能掌握NDK的運用了。
❸ android ndk 可以開發什麼
一、NDK產生的背景
Android平台從誕生起,就已經支持C、C++開發。眾所周知,Android的SDK基於java實現,這意味著基於Android SDK進行開發的第三方應用都必須使用Java語言。但這並不等同於「第三方應用只能使用Java」。在Android SDK首次發布時,Google就宣稱其虛擬機Dalvik支持JNI編程方式,也就是第三方應用完全可以通過JNI調用自己的C動態庫,即在Android平台上,「Java+C」的編程方式是一直都可以實現的。
不過,Google也表示,使用原生SDK編程相比Dalvik虛擬機也有一些劣勢,Android SDK文檔里,找不到任何JNI方面的幫助。即使第三方應用開發者使用JNI完成了自己的C動態鏈接庫(so)開發,但是so如何和應用程序一起打包成apk並發布?這裡面也存在技術障礙。比如程序更加復雜,兼容性難以保障,無法訪問Framework API,Debug難度更大等。開發者需要自行斟酌使用。
於是NDK就應運而生了。NDK全稱是Native Development Kit。
NDK的發布,使「Java+C」的開發方式終於轉正,成為官方支持的開發方式。NDK將是Android平台支持C開發的開端。
二、為什麼使用NDK
1.代碼的保護。由於apk的java層代碼很容易被反編譯,而C/C++庫反匯難度較大。
2.可以方便地使用現存的開源庫。大部分現存的開源庫都是用C/C++代碼編寫的。
3.提高程序的執行效率。將要求高性能的應用邏輯使用C開發,從而提高應用程序的執行效率。
4.便於移植。用C/C++寫得庫可以方便在其他的嵌入式平台上再次使用。
三、NDK簡介
1.NDK是一系列工具的集合
NDK提供了一系列的工具,幫助開發者快速開發C(或C++)的動態庫,並能自動將so和java應用一起打包成apk。這些工具對開發者的幫助是巨大的。
NDK集成了交叉編譯器,並提供了相應的mk文件隔離CPU、平台、ABI等差異,開發人員只需要簡單修改mk文件(指出「哪些文件需要編譯」、「編譯特性要求」等),就可以創建出so。
NDK可以自動地將so和Java應用一起打包,極大地減輕了開發人員的打包工作。
2.NDK提供了一份穩定、功能有限的API頭文件聲明
Google明確聲明該API是穩定的,在後續所有版本中都穩定支持當前發布的API。從該版本的NDK中看出,這些API支持的功能非常有限,包含有:C標准庫(libc)、標准數學庫(libm)、壓縮庫(libz)、Log庫(liblog)。
❹ 在android開發jni,為什麼jni.h導不進來
這個是個庫,需要你有NDK或者源碼編譯環境,單純的eclipse是不行的。。。會提示錯誤。
如果想編譯成功,你可以參考如下Android.mk,關鍵是
LOCAL_C_INCLUDES +=
$(JNI_H_INCLUDE)
////////////////////////////////////////////////////////////////
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE:= liblocalmeida
LOCAL_SRC_FILES:=
libmedia_jni.cpp
LOCAL_SHARED_LIBRARIES :=
liblog
libutils
libandroid_runtime
LOCAL_C_INCLUDES +=
$(JNI_H_INCLUDE)
LOCAL_PROGUARD_ENABLED:= disabled
include $(BUILD_SHARED_LIBRARY)
❺ android ndk 開發只寫jni層的代碼嗎不能寫hal層的代碼嗎以及linux驅動模塊的代碼嘛
NDK開發可以linux下的android源碼中編譯單個模塊生成.so文件,然後放在上層android 項目中調用,你在源碼中吧,你要編譯的模塊驅動的C代碼放進去,按照JIN規則取號名字,然後編\編譯,就行了,把生成的 so文件導入到上層項目,然後你知道C的函數名,在java層寫本地方法和,C的函數名一樣,記得類名也別搞錯了,就行了。不要燒錄整個系統,只要編譯你需要的驅動模塊生成so文件就行
❻ Android NDK開發簡介 NDK和SDK以及JNI有什麼關系
NDK:Android NDK 是在SDK前面又加上了「原生」二字,即Native Development Kit,因此又被Google稱為「NDK」。
NDK全稱:Native Development Kit。
NDK是一系列工具的集合。
* NDK提供了一系列的工具,幫助開發者快速開發C(或C++)的動態庫,並能自動將so和java應用一起打包成apk。這些工具對開發者的幫助是巨大的。
* NDK集成了交叉編譯器,並提供了相應的mk文件隔離CPU、平台、ABI等差異,開發人員只需要簡單修改mk文件(指出「哪些文件需要編譯」、「編譯特性要求」等),就可以創建出so。
* NDK可以自動地將so和Java應用一起打包,極大地減輕了開發人員的打包工作。
其實:
NDK就是能夠方便快捷開發.so文件的工具。JNI的過程比較復雜,生成.so需要大量操作,而NDK就是簡化了這個過程。
Android SDK:
SDK (software development kit)軟體開發工具包。被軟體開發工程師用於為特定的軟體包、軟體框架、硬體平台、操作系統等建立應用軟體的開發工具的集合。因此!Android SDk 指的既是Android專屬的軟體開發工具包
JNI:
Java Native Interface (JNI)標準是java平台的一部分,它允許Java代碼和其他語言寫的代碼進行交互。JNI 是本地編程介面,它使得在 Java 虛擬機 (VM) 內部運行的 Java 代碼能夠與用其它編程語言(如 C、C++ 和匯編語言)編寫的應用程序和庫進行交互操作
當然一般需要進行如下操作流程:
1) 編寫java程序:這里以HelloWorld為例。為了實現在 java代碼中調用c函數printf。
代碼1:
class HelloWorld {
public native void testHelloWorld();
static {
System.loadLibrary("hello");
}
public static void main(String[] args) {
new HelloWorld().testHelloWorld();
}
}
聲明native方法:如果你想將一個方法做為一個本地方法的話,那麼你就必須聲明改方法為native的,並且不能實現。
Load動態庫:System.loadLibrary("hello");
這里一般是以static塊進行載入的。同時需要注意的是System.loadLibrary()的參數「hello」是動態庫的名字。
2) 編譯
javac HelloWorld.java
3) 生成擴展名為h的頭文件 javah ?
JNIEXPORT void JNICALL Java_HelloWorld_testHelloWorld (JNIEnv *, jobject);
這個h文件相當於我們在java裡面的介面,這里聲明了一個 Java_HelloWorld_testHelloWorld (JNIEnv *, jobject)方法,然後在我們 的本地方法裡面實現這個方法,也就是說我們在編寫C/C++程序的時候所使用的方法名必須和這里的一致)。
4) 編寫本地方法實現和由javah命令生成的頭文件裡面聲明的方法名相同的方法
代碼2:
#include "jni.h"
#include "HelloWorld.h"
#include other headers
JNIEXPORT void JNICALL Java_HelloWorld_testHelloWorld(JNIEnv *env, jobject obj)
{
printf("Hello world!/n");
return;
}
注意代碼2中的第1行,需要將jni.h(該文件可以在%JAVA_HOME%/include文件夾下面找到)文件引入,因為在程序中的JNIEnv、 jobject等類型都是在該頭文件中定義的;另外在第2行需要將HelloWorld.h頭文件引入。然後保存為 HelloWorldImpl.c就ok了。
5) 生成動態庫
這里以在Windows中為例,需要生成dll文件。在保存HelloWorldImpl.c文件夾下面,使用VC的編譯器cl成。 cl -I%java_home%/include -I%java_home%/include/win32 -LD HelloWorldImp.c -Fehello.dll 注意:生成的dll文件名在選項-Fe後面配置,這里是hello,因為在HelloWorld.java文件中我們loadLibary的時候使用的名字是hello。
另外需要將-I%java_home%/include -I%java_home%/include/win32參數加上,因為在第四步裡面編寫本地方法的時候引入了jni.h文件。
❼ Android NDK Jni 開發C和C++的區別
NDK是谷歌開發的一用於Android開發調用C語言的工具,而JNI是Java調用C語言的協議,橋梁。 谷歌在Android2.3版本變開發出NDK供開發者使用,開發者使用它可以很方便的調用C代碼,而代碼書寫規范需要遵循JNI協議進行定義。 JNI一開始是為了本地已編譯語言,尤其是C和C++而設計的,但是它並不妨礙你使用其他語言,只要調用約定受支持就可以了。使用java與本地已編譯的代碼交互,通常會喪失平台可移植性。但是,有些情況下這樣做是可以接受的,甚至是必須的,比如,使用一些舊的庫,與硬體、操作系統進行交互,或者為了提高程序的性能。
❽ android使用jni開發,能不能使用信號的
可以。實現JNI原生函數源文件:
新建com_lucyfyr_HelloWorld.c文件:
#include <jni.h>
#define LOG_TAG "HelloWorld"
#include <utils/Log.h>
/* Native interface, it will be call in java code */
JNIEXPORT jstring JNICALL Java_com_lucyfyr_HelloWorld_printJNI(JNIEnv *env, jobject obj,jstring inputStr)
{
LOGI("fresne Hello World From libhelloworld.so!");
// 從 instring 字元串取得指向字元串 UTF 編碼的指針
const char *str =
(const char *)(*env)->GetStringUTFChars( env,inputStr, JNI_FALSE );
LOGI("fresne--->%s",(const char *)str);
// 通知虛擬機本地代碼不再需要通過 str 訪問 Java 字元串。
(*env)->ReleaseStringUTFChars(env, inputStr, (const char *)str );
return (*env)->NewStringUTF(env, "Hello World! I am Native interface");
}
/* This function will be call when the library first be load.
* You can do some init in the libray. return which version jni it support.
*/
jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
void *venv;
LOGI("fresne----->JNI_OnLoad!");
if ((*vm)->GetEnv(vm, (void**)&venv, JNI_VERSION_1_4) != JNI_OK) {
LOGE("fresne--->ERROR: GetEnv failed");
return -1;
}return JNI_VERSION_1_4;
}
OnLoadJava_com_lucyfyr_HelloWorld_printJNI
函數裡面做一些log輸出 注意JNI中的log輸出的不同。
JNI_OnLoad函數JNI規范定義的,當共享庫第一次被載入的時候會被回調,
這個函數裡面可以進行一些初始化工作,比如注冊函數映射表,緩存一些變數等,
最後返回當前環境所支持的JNI環境。本例只是簡單的返回當前JNI環境。
❾ android studio 怎樣進行jni開發
方法如下:
1.添加如下代碼在MainActivity類內
static {
System.loadLibrary("hello_jni");
}
public native String getstringfromC();
2.打開終端,android studio已經提供了終端
3.首先進入java目錄執行命令:
javah -d ../jni com.example.root.ndk_sample.MainActivity
com.example.root.ndk_sample.MainActivity是native函數的所在的包名和類名,中間使用「.」號分開
4.添加*.c文件在jni目錄中
5.編寫Android.mk和Application.mk 放在jni目錄下面
6.Android.mk文件的內容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE :=hello_jni
LOCAL_SRC_FILES := hello_jni.c
include $(BUILD_SHARED_LIBRARY)
Application.mk 文件內容為:
APP_ABI := all
APP_OPIM :=debug
❿ android native jni 開發應用有哪些
我們知道,Android系統的底層庫由c/c++編寫,上層Android應用程序通過Java虛擬機調用底層介面,銜接底層c/c++庫與Java應用程序間的介面正是JNI(JavaNative Interface)。本文描述了如何在ubuntu下配置AndroidJNI的開發環境,以及如何編寫一個簡單的c函數庫和JNI介面,並通過編寫Java程序調用這些介面,最終運行在模擬器上的過程。