导航:首页 > 操作系统 > androidndklibpng

androidndklibpng

发布时间:2022-06-10 07:19:54

android ndk与sdk

1. SDK

Android SDK(Android Software Development Kit),即Android软件开发工具包,Android的SDK基于java实现,这意味着基于Android SDK进行开发的第三方应用都必须使用Java语言。但这并不等同于“第三方应用只能使用Java”,也就是说我们还可以采用C/C++语言。

2. NDK

NDK即Native Development Kit,众所周知,Android程序运行在Dalvik虚拟机中,NDK允许用户使用类似C / C++之类的原生代码语言执行部分程序。

NDK是一系列工具的集合。它提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk(AndroidPackage的缩写,Android安装包)。这些工具对开发者的帮助是巨大的。它集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。它可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作

NDK提供了一份稳定、功能有限的API头文件声明,Google明确声明该API是稳定的,在后续所有版本中都稳定支持当前发布的API。从该版本的NDK中看出,这些API支持的功能非常有限,包含有:C标准库(libc)、标准数学库(libm)、压缩库(libz)、Log库(liblog)。

为什么使用NDK

(1) 代码的保护。由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。

(2) 可以方便地使用现存的开源库。大部分现存的开源库都是用C/C++代码编写的。

(3) 提高程序的执行效率。将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。

(4)便于移植。用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相互调用时平白又增大了开销。

Ⅲ 关于Android NDK 开发方面的书籍有哪些推荐

我并不完全同意繁华的说法。 下面是我的观点。 首先你必须明确你究竟是做什么类型的Android开发。 目前最多的1.Android游戏 2.Android应用 而目前在我看来Android又分为几种开发形式。这里底层驱动那部分不包括在内。 1.纯Java 2.纯c/c++ 3.java+c/c++ 纯java写Android当然java你必须得弄好。 java+ c/c++那你java更得学好。因为目前的java+c/c++的开发都是基于NDK的。而NDK更多的是依赖于java里面已有的jni那部分。 至于纯C我不知道有多少人目前在使用这部分进行开发。这一部分你就必须了解程序的生命周期以及了解c/c++。 经典的入门书的话。其实我个人觉得没必要专门去买一本书。 你可以在网上搜索android开发入门。纯Java的估计比较多 把环境一搭。创建第一个项目把所有的目录。把控件用demo熟悉一遍。再来个举一反三。接着研究一下服务 数据库 协议 。再进行项目实际练习。完了做完小个项目想一下。就差不多入门了。 至于java+c/c++那你研究完这部分之后再研究一下jni。然后完了你还得研究一下gnu你得知道Android的makefile怎么去写。接着你还得了解如何进行库移植。jni这部分最大的好处就是库移植。这样等你入门基本上得小半年。而且兴许你还觉得自己没学什么。当然那些对程序理解很深刻的其他语言大牛应该会快些。 接着说纯C。这方面的资料网上极少。最多的是google给的官方demo看哪个nativeactivity自己去研究。当然Guide写过一本相关的书。很牛掰。全英文。写得狠好。里面涉及到opengl opensl glue libpng EGL等不过遗憾的是google目前为止还没开放控件接口。不过我想以后肯定会有。不过没控件可以自己写不过这样的深度应该是一个环球旅游。也就是说做应用这种方式的挑战比较大。 一看写了挺多的。呵呵不由想起我自学Android的经历。凄凉啊。

Ⅳ 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文件。

Ⅳ NDK下的two-libs例子与zlib,libpng一起编译时出现连接不成功

楼主怎么解决的?求告知

Ⅵ 怎么解决android studio libpng error not a png file错误怎么解决

Information:Gradle tasks [:app3:assembleDebug]
:app3:preBuild
:app3:compileDebugNdk UP-TO-DATE
:app3:preDebugBuild
:app3:checkDebugManifest
:app3:prepareDebugDependencies
:app3:compileDebugAidl UP-TO-DATE
:app3:compileDebugRenderscript UP-TO-DATE
:app3:generateDebugBuildConfig UP-TO-DATE
:app3:generateDebugAssets UP-TO-DATE
:app3:mergeDebugAssets UP-TO-DATE
:app3:generateDebugResValues UP-TO-DATE
:app3:generateDebugResources UP-TO-DATE
:app3:mergeDebugResources
:app3:mergeDebugResources FAILED
C:/Users/Administrator/AndroidStudioProjects/MyApplication3/app3/src/main/res/drawable-hdpi/Chrysanthemum.png
Error:Error: Invalid file name: must contain only lowercase letters and digits ([a-z0-9_.])
Error:Execution failed for task ':app3:mergeDebugResources'.
> C:/Users/Administrator/AndroidStudioProjects/MyApplication3/app3/src/main/res/drawable-hdpi/Chrysanthemum.png: Error: Invalid file name: must contain only lowercase letters and digits ([a-z0-9_.])
这时候是不是感觉很迷茫,出错了对吧,下面就告诉你是怎么回事,怎么出错的。
错误很简单却也很难发觉,原因就是在这张图片上,为什么是图片上呢,刚开始的时候你的图片是不是.jpg格式的,然而你把后缀名改成了.png的以为就可以了是吧,其实不是这样,你只是把格式改成了.png,其实它还是.jpg格式的。要将图片真正转换成.png格式的才行。随便找个图片转换工具就可以解决。

注意:在存放图片时千万不要将格式为.jpg的图片改成.png格式,千万不要偷懒,一定要将格式转换成PNG格式的图片,否则编译将不通过。切记!!!!

Ⅶ 移植libpng库怎么连接使用

1.到libpng的官网上download自己相应的平台libpng的库.然后解压
2.查看makefile文件的内容。创建一个文件夹 查看makefile文件里面编译成库必须包含的文件到该文件里面在这里我文件名取名为png。
以下是libpng1510的makefile文件中比较全的说了包含所有编译libpng库需要的文件的语句。
OBJS = png.o pngset.o pngget.o pngrutil.o pngtrans.o pngwutil.o \
pngread.o pngrio.o pngwio.o pngwrite.o pngrtran.o \
pngwtran.o pngmem.o pngerror.o pngpread.o
(.o文件是编译生成链接库必要的中间文件)
3.1(这里有多种方法。3.1代表3步的第1种方法。)单独编译成so文件或.a文件(动态或静态链接库文件)然后移植到项目。该方法具体写法可以参考ndk里面docs文件夹下的ANDROID-MK.html的文档。
3.1.1(3.1代表3步的第1种方法的第一步。):你可以建立一个jni文件夹然后把刚才的png文件夹扔到jni文件夹里面然后再创建一个.mk文件。内容如下
静态
LOCAL_PATH :=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE :=png
LOCAL_SRC_FILES := png/png.c png/pngset.c png/pngget.c png/pngrutil.c png/pngtrans.c png/pngwutil.c \
png/pngread.c png/pngrio.c png/pngwio.c png/pngwrite.c png/pngrtran.c \
png/pngwtran.c png/pngmem.c png/pngerror.c png/pngpread.c
include $(BUILD_STATIC_LIBRARY)
动态
LOCAL_PATH :=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE :=png
LOCAL_SRC_FILES := png/png.c png/pngset.c png/pngget.c png/pngrutil.c png/pngtrans.c png/pngwutil.c \
png/pngread.c png/pngrio.c png/pngwio.c png/pngwrite.c png/pngrtran.c \
png/pngwtran.c png/pngmem.c png/pngerror.c png/pngpread.c
include $(BUILD_SHARED_LIBRARY)
(当然你可以直接去掉把里面的文件放在jni下面就不需要夹png/了)
3.1.2:如果你解压好了ndk那么把ndk的目录加入环境变量之后那么你就可以CD进入jni所在的上一层目录。进行ndk-build了。这时候在你的新生成的libs和obj文件夹里面就可以得到你想要的链接库了。(如果你是用的是静态的那么libs文件夹里面是不会有的。因为libs文件夹里面的东西将来会直接打包到apk的。而静态链接库不会自动打包到里面只能以动态库打包进去。)
3.1.3:好了得到了链接库之后你就可以到你的ndk项目里面使用了!这时候你需要把你的动态链接库直接复制到你的项目的jni文件夹下面。然后在里面编写以下这样的类似的mk文件:
LOCAL_PATH :=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := png
LOCAL_SRC_FILES := libpng.so
#include $(BUILD_STATIC_LIBRARY) #如果是使用静态的库把这句include前的#去掉
#include $(BUILD_SHARED_LIBRARY) #如果是使用动态的库把这句include前的#去掉

include $(CLEAR_VARS)
LOCAL_MODULE := ourproject
LOCAL_SRC_FILES := ourproject.c
#LOCAL_STATIC_LIBRARIES := libpng #如果是使用静态的库把这句include前的#去掉
#LOCAL_SHARED_LIBRARIES := libpng #如果是使用动态的库把这句include前的#去掉
include $(BUILD_SHARED_LIBRARY)

编写好之后你就可以CD到你项目路径然后ndk-build了。在你的 ourproject.c
文件里面试着写一下png库的调用。

Ⅷ 我在Android底层利用NDK使用OpenGL,但是好多函数都用不了,比如glColor3f这个函数,我该怎么添加

glColor3f(1.0,1.0,1.0) glColor上颜色用的。3f表示3个浮点型参数 分别代表RGB三色。参数范围在0.0~1.0间。

Ⅸ android ndk到底是什么

NDK是一系列工具的集合。它提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk(AndroidPackage的缩写,Android安装包)。这些工具对开发者的帮助是巨大的。它集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。它可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。
NDK提供了一份稳定、功能有限的API头文件声明,Google明确声明该API是稳定的,在后续所有版本中都稳定支持当前发布的API。从该版本的NDK中看出,这些API支持的功能非常有限,包含有:C标准库(libc)、标准数学库(libm)、压缩库(libz)、Log库(liblog)。

Ⅹ android 中怎么使用ndk

程序中一些逻辑是用C写的,使用jni调用C代码,使用基本的打log的方式很难查看大型数组,了解到android ndk sdk中有个工具叫ndk-gdb可以很方便地对c代码进行调试,使用过程并不顺利,遇到两个错误,耗时一周终于解决。如果是在windows下,需要安装cygwin。首先,在cygwin命令行下进入到你工程的根目录下如果你要调试的程序已经在运行了,直接运行ndk-gdb
如果你要调试的程序没有运行,可以使用ndk-gdb --start
键入ndk-gdb命令,会出现一系列库文件加载的信息,这些库可能会加载失败,不过没有关系
出现<gdb>提示符,输入help命令可以查看一系列命令使用l命令列出c文件的内容,但是遇到 No symbol table is loaded. Use the "file" command.使用以下命令加载需要调试的so文件:
file obj/local/armeabi/libsearch-algorithm.so使用list或者l可以查看加载的c文件。使用b 100,在c文件的第100行设置断点。
使用c或者continue命令继续运行程序。
出现错误:Continuing.
Warning:Cannot insert breakpoint 1.
Error accessing memory address 0x11a0: Input/output error.错误原因:使用ndk-gdb --start 启动程序第一个activity,但是此时so文件并没有被加载。
解决方法:首先打开程序并使用,在保证so文件已经被使用的情况下,调用ndk-gdb命令调试程序进程。
正确流程:
1.创建一个模拟器或者使用真机运行想要调试的程序,确保so文件已经被加载。
2.在此程序的根目录下调用ndk-gdb,出现gdb提示符。
3.使用l命令,应该可以打印出c文件。
4.使用b 10,可以在c文件的第十行打印断点。
5.使用c命令恢复程序运行。

阅读全文

与androidndklibpng相关的资料

热点内容
iphone如何快速分组app 浏览:785
程序员喝的纯牛奶 浏览:251
nginxphpupload 浏览:111
汽车单片机技术教学大纲 浏览:848
解压视频白头小哥 浏览:748
cadq命令 浏览:956
python连接本地数据库报错 浏览:194
手机模拟加密禁卡操作 浏览:105
电荷数怎么算法 浏览:589
cad如何打开命令行 浏览:151
php图片限制大小 浏览:164
程序员一夜未归 浏览:593
苹果xsmaxapp怎么不显示更新 浏览:600
苹果app怎么清除角标 浏览:483
解压屁屁玩具脏了怎么办 浏览:670
算法识别自动折叠 浏览:10
dos命令遍历文件 浏览:456
翻译整个pdf 浏览:198
怎么给解压软件授权 浏览:622
怎么换手机桌面壁纸安卓 浏览:957