以Hello Android工程为例。

建立好工程hello-a,在jni目录下创建文件hello-a.c,文件内容如下。(注意是jni目录,使用src目录编译会出错)

#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

好,我们试试看

NDK 编译可执行程序的更多相关文章

  1. 使用ndk编译c可执行程序

    1.创建工程目录  在ubuntu系统下搭建好ndk编译环境,创建test目录 mkdir test 在test目录下创建jni目录 cd test mkdir jni 2.编写源代码 vim hel ...

  2. android NDK编译(导入).a文件和编译多个so文件(转)

    源:android NDK编译(导入).a文件和编译多个so文件 一.编译一个静态库 libstatic_android.a LOCAL_PATH := $(call my-dir) include ...

  3. Android APP使用NDK编译后的ffmpeg库出现undefined reference to 'posix_memalign'错误

    在android程序中使用NDK编译后的ffmpeg库的时候出现了如下错误: jni/libs/libavutil.a(mem.o): in function av_malloc:libavutil/ ...

  4. Linux下NDK编译FFMPEG包含neon参数

    FFMPEG编译成Android库已经有很多案例了,编译优化neon的也很多,以下是我通过实践成功的案例,这里主要讲编译的配置文件,其他设置可结合Linux下使用NDK编译FFMPEG(libstag ...

  5. Linux下使用NDK编译FFMPEG(libstagefright)

    这个月要负责一个项目,使用FFMPEG渲染视频,主要是Android端的,由于性能要求,要使用硬解码,但网上大多数教程都是没有libstagefright的,所以个人觉得,生成的so库文件也是没有开启 ...

  6. Android Studio 中关于NDK编译及jni header生成的问题

    之前由于工作原因使用grails这个基于groovy的框架做项目,对groovy感觉很好. 基于groovy的gradle构建系统对我而言自然也是好的没得说. Android Studio 正式版出来 ...

  7. [原]如何用Android NDK编译FFmpeg

    我们知道在Ubuntu下直接编译FFmpeg是很简单的,主要是先执行./configure,接着执行make命令来编译,完了紧接着执行make install执行安装.那么如何使用Android的ND ...

  8. ffmpeg2.2在ubuntu下使用NDK编译——并在android工程下测试使用

    作者:wainiwann 出处:http://www.cnblogs.com/wainiwann/ 本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...

  9. android开发 NDK 编译和使用静态库、动态库 (转)

    在eclipse工程目录下建立一个jni的文件夹 在jni文件夹中建立Android.mk和Application.mk文件 Android.mk文件: Android提供的一种makefile文件, ...

随机推荐

  1. DrawerLayout带有侧滑功能的布局类(2)

    ActionBarDrawerToggle: 在前一张中我们并没有使用drawLayout.setDrawerListener(); 对应的参数对象就是DrawerLayout.DrawerListe ...

  2. hdu 2112 HDU Today

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2112 HDU Today Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的 ...

  3. JavaScript高级程序设计之作用域链

    JavaScript只有函数作用域:每个函数都有个作用域链直达window对象. 变量的查找由内而外层层查找,找到即止. 同时不仅可以查找使用,甚至可以改变外部变量. var color = &quo ...

  4. ios中怎么样自动剪切图片周围超出的部分

    UIImageView *image = [[UIImageView alloc] init]; image.clipsToBounds = YES;

  5. 教你怎么安装RabbitMQ

    以下命令以root用户运行:#echo 'deb http://www.rabbitmq.com/debian/ testing main' >> /etc/apt/sources.lis ...

  6. jquery页面刷新reload

    今天知道了jquery页面刷新的一个方法,很简单的一句: window.location.reload()刷新当前页面,不得不说我jquery学的很糟糕,明明都学过,但是等用到的时候就想不起来了.不过 ...

  7. sharepoint 2010 误删除AD组用户不能访问

    不小心误操作把ad中的组删除了,在sharepoint中是通过组给的权限,在ad中新建了一个同样名的组给了权限组下面的用户还是不能访问. 解决方法: 在sharepoint中把这组从网站集中删除,重新 ...

  8. Ubuntu 关闭锁屏界面的 on-screen keyboard

    试了试屏幕键盘,在 系统设置里开启了,又关了,但是在屏幕解锁时总是出现 screen keyboard,老烦人了,不知到在哪里关闭了,系统设置里面都关了,网上搜了解决办法,原来在这里 把 show w ...

  9. 软件工程随堂小作业——随机四则运算Ⅱ之算法思路(C++)

    1.题目避免重复: (1)利用系统时间来产生随机数,重复率会降低. (2)建立链表,逐个判断.可读取写入文件. 2.可定制(数量/打印方式): (1)格式有默认值; (2)可以选择重新设置分几列和每行 ...

  10. 团队作业index

    <head><meta http-equiv="Content-Type" content="text/html; charset=gb2312&quo ...