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;
}
}