继续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!
成功了。
这种方法虽然解决了问题,但是并没有理解问题的实质。好,保持求知的强劲势头和欲望,这就有了第二种解决办法。
我们先来看看开发者对这个问题的描述:
“Themanifest 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
好,我们试试看
成功了,看看在模拟器上的运行效果:
转自:http://www.cnblogs.com/gaozehua/archive/2011/09/02/2164077.html
分享到:
相关推荐
android JNI运行NDK编译成的可执行文件。 具体信息参考博客http://blog.csdn.net/csdn49532/article/details/50698666
live555 库 和 testRtspClient.cpp 编译生成静态库 和 可执行文件 testRtspClient 编译方法: 首先进入各个模块执行 Makefile,将静态库拷贝至上层目录 执行 ndk-build
curl库源码添加了curl_config.h和mk文件,可以直接跳转到目录使用ndk-build编译出so库.
详细介绍android ndk编译环境搭建,可以自行编译android app所需的C++/C代码实现的高效率功能动态库文件,借JAVA层调用.
通过ndk编译opencv源码,能够根据自己的需求修改编译对应的opencv库。整个过程重要的也就是写makefile文件进行编译而已。
ubuntu下android ndk编译环境搭建,android应用程序开发,环境编译
使用Android NDK编译Android平台的eXosip库,有静态库和动态库。
openssl ndk编译的库。可用于Poco编译PocoNetSSL(已验证)或其他场景。
用Android_NDK编译FFmpeg,RTSP手机视频
opus NDK 编译 Android.mk文件 仅供参考
http://blog.csdn.net/xuie0000/article/details/50470129示例
原生lapack是用fortran语言写的,而NDK默认没有fortran编译环境,所以在安卓上想使用强大的lapack进行矩阵、线性代数运算变得十分困难。 最近找到某大神翻译的c语言版lapack,下载下来经过简单调试竟然可以用。 步骤...
安卓 NDK 编译lua 所需要的所有文件 包含java声明 和C源码 使用方式 我的博客
libunwind ndk编译配置文件
arm平台下使用ndk工具交叉编译python,用于android系统;android-arm平台ndk交叉编译python
使用ndk编译box2d物理引擎,并将它移植到android上,测试代码为Box2D自带的Example helloworld.
cd /cygdrive/d/workspace/.../jni //跳转到项目jni目录 /cygdrive/d/android-ndk-r8/ndk-build //编译 /cygdrive/d/android-ndk-r8/ndk-build clean //清除
windows下Android,ndk编译C文件脚本,完整说明和使用,只支持cmake方式。
ubuntu下ndk编译ffmpeg0.8.1,详细介绍了如何将ffmpeg移植到linux下,生成的so动态链接库文件可以直接在android里使用。
Android ndk编译demo,在soxr的源码上完善了Android NDK的编译脚本,快速编译出需要的soxr