javandk
⑴ 安卓用SDK 或者NDK來編,程序運行速度差多少聽說SDK快
android sdk 開發就是通常意義上的 android java 開發;
android ndk 開發主要是指 android c/c++ 開發;
他們在速度上的差距主要體現在兩種類型的編程語言上的區別;
① java屬於解釋性語言,c/c++屬於編譯性語言,java 比 c/c++ 慢;
② java代碼的安全機製做的很高,c/c++的安全機制低,就好比一個通道,有一個有安檢,一個沒有安檢,有了安檢必然會導致速度降低,java 比 c/c++ 慢;
③ java開發主要注重業務邏輯,c/c++開發注重效率,兩類語言的開發者的思維也影響著程序運行的速度,java 比 c/c++慢;
④ 其他;
綜上所述,java比c/c++慢,即 sdk 比 ndk慢,更多的可以參考:
http://tieba..com/p/3222232840
我是ndk吧的吧主,有問題可以來ndk吧反應,也希望大家多關注ndk,ndk吧鏈接:
http://tieba..com/f?kw=ndk
謝謝!
⑵ 安卓開發一定要用 Java 嗎,其他語言開發方便嗎
安卓開發不一定使用Java。
使用NDK,用純C語言或C++語言就可以做安卓平台的開發,只是這樣難度比較大。
一般開發中,要麼是用Java開發;要麼是Java和C、C++結合來開發。
⑶ 「Android NDK 」是什麼,在什麼情況下使用
1、NDK是一系列工具的集合。
2、NDK提供了一份穩定、功能有限的API頭文件聲明。
3、NDK的發布,使「Java+C」的開發方式終於轉正,成為官方支持的開發方式。
4、NDK將使Android平台支持C開發的開端。
NDK使得在android中,java可以調用C函數庫。我們都知道,java是半解釋型語言,很容易被反匯編後拿到源代碼文件,在開發一些重要協議時,我們為了安全起見,使用C語言來編寫這些重要的部分,來增大系統的安全性。還有,在一些接近硬體環境下,相信大家都清楚C與java的優劣。順帶提一下:NDK並不能顯著提升應用效率。why?我們都覺得C語言比起java來說效率要高出很多,一方面,隨著jdk的不斷更新,java的效率也隨之提高;另一方面,即便使用C語言編碼提高了應用效率,但是在java與C相互調用時平白又增大了開銷。
⑷ 安卓sdk和ndk都是什麼有什麼區別哪個更有前途
讓我先來說說android sdk (Android Software Development Kit, 即Android軟體開發工具包)可以說只要你使用java去開發Android這個東西就必須用到。他包含了SDK Manager 和 AVD Manage
對於android系統的一些開發版本的管理以及模擬器管理。
而ndk (Native Development Kit)跟sdk差不多的是他也是一個開發工具包。用他開發c/c++是很方便的。他有一個強大的編譯集合。
其實名詞的解釋我也不想多說。這點你只需要網路分別輸入sdk 和 ndk 網路里就有你想要的。
區別是什麼我只想說是他們基本上是應該沒什麼相同的。
至於哪個更有前途。
這個不好說。
我來說說android他為什麼會有一個ndk把。
很早以前android是只有sdk的。並沒有ndk。這就意味著一旦android的開發者要使用c/c++的三方庫或者需要用到c/c++就必須使用非官方的法子。用java的jni去調用c/c++。耍小聰明走後門一樣。而ndk的出現就意味著jni調用的這種方法轉正了變成官方了以後你不需要再走後面大路正面隨你走。
可是這樣還是沒有說到為什麼要有ndk啊。是的我只想說的就是如果你要操作底層直接操作內存。操作地址那你不得不去使用c/c++因為java這塊想做這些。那恐怕有點困難。所以ndk是必須需要出現的。
而這個sdk和ndk並不是完全不相溶的2門語言。對於android來說是同種語言的2種不同時期的必須品。
最後想說如果你做android開發想要做得更好你就必須要ndk的。
一句套話:學得好什麼都有前途、
⑸ ndk是什麼
1、NDK是一系列工具的集合。
* NDK提供了一系列的工具,幫助開發者快速開發C(或C++)的動態庫,並能自動將so和java應用一起打包成apk。這些工具對開發者的幫助是巨大的。
* NDK集成了交叉編譯器,並提供了相應的mk文件隔離CPU、平台、ABI等差異,開發人員只需要簡單修改mk文件(指出「哪些文件需要編譯」、「編譯特性要求」等),就可以創建出so。
* NDK可以自動地將so和Java應用一起打包,極大地減輕了開發人員的打包工作。
2、NDK提供了一份穩定、功能有限的API頭文件聲明。
⑹ 用c++ ndk開發android,和用原生java開發有什麼優劣
看了你的描述,我想這個so應該沒有包括與java交互這塊的介面,你需要另外編寫一個so通過JNI提供java與該C項目的交互介面。這個C項目的頭文件你應該有吧,你只需用JNI再封裝一下就可以了。
⑺ javah是ndk裡面的函數嗎
在一些Android應用的開發中,需要通過JNI和 Android NDK工具實現JAVA和C/C++之間的相互調用。 Java Native Interface (JNI)標準是java平台的一部分,它允許Java代碼和其他語言寫的代碼進行交互。JNI是本地編程介面,它使得在 Java 虛擬機 (VM)內
⑻ android ndk 中,java的string傳到c++的char*再傳回來,輸出我看到是一樣的,但是系統判斷不一樣,原因
Java中字元串的比較須要用equals函數:
Stringa=rib("ceshi");
if(a.equals("ceshi"))
{
//...相同
}
else
{
//...不相同
}
⑼ 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 開發,C++ 調用Java的方法
Android.mk文件:
LOCAL_SRC_FILES參數用空格隔開
[c-sharp]view plainprint?
LOCAL_PATH:=$(callmy-dir)
include$(CLEAR_VARS)
LOCAL_MODULE:=native
LOCAL_SRC_FILES:=geolo.cppmy_jni.h
include$(BUILD_SHARED_LIBRARY)
2. geolo.cpp
先用FindClass方法找到java類,有點類似java的反射用LoadClass
再用CallObjectMethod方法調用Java類的函數。
[c-sharp]view plainprint?
#include"my_jni.h"
jobjectgetInstance(JNIEnv*env,jclassobj_class){
jmethodIDconstruction_id=env->GetMethodID(obj_class,"<init>","()V");
jobjectobj=env->NewObject(obj_class,construction_id);
returnobj;
}
JNIEXPORTjstringJNICALLJava_com_easepal_geolo_CActivityMain_stringFromJNI(JNIEnv*env,jobjectthiz){
jstringstr;
jclassjava_class=env->FindClass("com/easepal/geolo/CForCall");
if(java_class==0){
returnenv->NewStringUTF("notfindclass!");
}
jobjectjava_obj=getInstance(env,java_class);
if(java_obj==0){
returnenv->NewStringUTF("notfindjavaOBJ!");
}
jmethodIDjava_method=env->GetMethodID(java_class,"GetJavaString","()Ljava/lang/String;");
if(java_method==0){
returnenv->NewStringUTF("notfindjavamethod!");
}
str=(jstring)env->CallObjectMethod(java_obj,java_method);
returnstr;
}
3. my_jni.h
[c-sharp]view plainprint?
/*DONOTEDITTHISFILE-itismachinegenerated*/
#include<jni.h>
/*Headerforclasscom_easepal_geolo_CActivityMain*/
#ifndef_Included_com_easepal_geolo_CActivityMain
#define_Included_com_easepal_geolo_CActivityMain
#ifdef__cplusplus
extern"C"{
#endif
/*
*Class:com_easepal_geolo_CActivityMain
*Method:stringFromJNI
*Signature:()Ljava/lang/String;
*/
JNIEXPORTjstringJNICALLJava_com_easepal_geolo_CActivityMain_stringFromJNI(JNIEnv*,jobject);
#ifdef__cplusplus
}
#endif
#endif
4.CActivityMain.java
[c-sharp]view plainprint?
packagecom.easepal.geolo;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.widget.TextView;
{
/**.*/
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
TextViewtv=newTextView(this);
tv.setText(stringFromJNI("hello"));
setContentView(tv);
}
static{
System.loadLibrary("native");
}
(Stringstr);
}
5.CForCall.java
[c-sharp]view plainprint?
packagecom.easepal.geolo;
publicclassCForCall{
publicCForCall(){};
//public~CForCall(){};
publicStringGetJavaString(){
Stringstr;
str="123456";
returnstr;
}
}