Android 开发手记二 C可执行程序编译实例
来源:互联网 发布:淘宝商家等级划分 编辑:程序博客网 时间:2024/05/19 23:25
继续 NDK 的开发。上次我们的实例中,对 C 应用程序的编译链接,自己编写的 makefile 是件比较困难的事情。虽然最后成功了,不过中间经历了不少坎坷。我们现在研究下如何用 NDK 提供的 build 工具,实现我们的目标。
还是以 Hello Android 工程为例。
建立好工程
hello-a
,在
jni
目录下创建文件
hello-a.c,
文件内容如下。
#include <stdio.h>
int main()
{
printf("Hello Android!/n");
return 0;
}
在该目录下,创建
Android.mk
文件,内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := helloa
LOCAL_SRC_FILES := hello-a.c
include $(BUILD_EXECUTABLE)
这里需要注意的上面红色部分,指定我们现在要生成一个可执行的文件。
在工程下运行
ndk-build
,结果提示错误:
这个提示告诉我们,在工程中没有找到
AndroidManifest.xml 文件。若创建了
Java
应用程序,会自动生成该文件。在该文件中,
描述了程序包的一个全局变量 , 包括暴露的应用组件 (activities, services 等等 ) 和为每个组件的实现类 , 什么样的数据可以操作 , 以及在什么地方运行。而这里,我们根本不需要这个文件。那么为什么会有这样的错误提示呢?
其实这个和 NDK 的版本有关系。现在最新的版本,就是我用的版本 NDK r4 版,与之前的版本,一个很大的改变,就是对工程源文件路径及组织结构的变化。在 NDK r3 版,按装 NDK 后,需要运行 setup.sh 来创建编译环境,需要在<NDK>APPS/ 目录下,创建同名的工程,然后添加 Application.mk, 然后编译的时候,执行 make APP=yourproject 。 新的版本不需要再去创建这个同名的 app 工程,直接用编译工具 ndk-build 就可以了。这个工具实际上是对 build 编译工具的一层封装,每次编译都会自动去设置一次编译环境,然后调用工程中的 Android.mk 来进行工程的编译,原来的那个Application.mk 也不是必须的了,只有在需要的时候,才去创建。不过相比前一版本,就是增加了对 AndroidManifest.xml文件的检查。
我们如何解决这个问题呢?有两个办法:一是手动创建一个 AndroidManifest.xml 文件,然后里面内容为空项就行,如
<?xml version="1.0" encoding="utf-8"?>
<manifest/>
我们再次运行
ndk-build
,成功。
我们试试可否正常运行:
看到了
Hello Android!
成功了。
这种方法虽然解决了问题,但是并没有理解问题的实质。好,保持求知的强劲势头和欲望,这就有了第二种解决办法。
我们先来看看开发者对这个问题的描述:
“The manifest is only required to find the top-level of your project path (ndk-build can be invoked in any sub-directory of your project).”
那么,我们只要在编译前指定工程路径就行了,如何做呢?简单!
ndk-build NDK_PROJECT_PATH=/path/to/project
好,我们试试看
成功了,看看在模拟器上的运行效果:
- Android 开发手记二 C可执行程序编译实例
- Android 开发手记二 C可执行程序编译实例
- Android 开发手记二 C可执行程序编译实例
- Android-------C语言可执行程序编译实例
- Android-------C语言可执行程序编译实例
- Android-------C语言可执行程序编译实例
- ANDROID NDK实践开发系列--(01) 使用ndk编译c可执行程序
- android 编译C程序 在android下可执行
- ndk编译c可执行程序
- NDK编译C可执行程序
- NDK编译Android上运行的C可执行程序
- ubuntu交叉编译android平台可执行C程序
- 可执行的android C 程序
- ndk编译c可执行程序(jni 入门)
- ndk编译c可执行程序(jni 入门)
- ndk编译c可执行程序(jni 入门)
- gcc手动编译android可执行程序
- Windows下Qt for Android 编译安卓C语言可执行程序
- Java抽象类和接口的区别
- programming-challenges Unidirectional TSP (111104) 题解
- View的bounds和frame的区别
- Java的四中引用类型
- 源码解析Android中View的measure量算过程
- Android 开发手记二 C可执行程序编译实例
- 有效的括号序列(LintCode)
- Java内部类为什么可以访问外部类的成员
- Android 多线程-----AsyncTask详解
- 《程序员面试金典》--寻找二叉树中某个节点中序遍历的下一个节点
- UIView的层次调整,及子view布局模式自动布局模式(停靠模式)
- Android中使用Serializable和Parcelable实现序列化详解(含实例)
- 软件工程 可行性研究 习题2
- UFT