Android C编程技巧

运行模拟器

  emulator -console

  * 将文件写入到模拟器的userdata.img文件中

  adb push

  *将一个目录拷贝到模拟器中,包括子目录

  adb push

  * 将一个目录从模拟器中拷出来

  adb pull

  * 使得模拟器可以运行arm代码.

  使用GNU/ARM Linux编译器编译你的应用程序就可以了

  * 在模拟器里面运行shell,需要先运行模拟器

  adb shell

  *运行模拟器中的一个控制台程序

  adb shell

  *连接模拟器的控制台

  telnet localhost 5554/6/8

  运行C程序

  参考文献

  Native C "Hello World" working in emulator

  http://groups.google.com/group/a ... wse_thread/threa...

  Native C Applications for Android

  http://benno.id.au/blog/2007/11/13/android-native-apps

  步骤

  * 下载GNU/ARM编译工具

  http://www.codesourcery.com/gnu_toolchains/arm/download.html

  * 编写c/c++代码.

  * 使用GNU/ARM Linux 工具创建一个应用程序,不使用动态链接库

ex. arm-none-linux-gnueabi-g++.exe -static -o hello HelloAndroid.cpp

  * 启动模拟器

$SDK_ROOT/tools/emulator.exe

  * 在命令行窗口运行 abd将编译好的hello程序放入模拟器的磁盘

 adb push hello /system/sbin/hello

  * 让hello文件变成可执行程序,不要使用 chmod ugo+x

 adb shell chmod 777 /system/sbin/hello

  * 运行hello程序

  adb shell

  cd /system/sbin/

  hello

  EXAMPLE HELLO WORLD CODE

  //
  // HelloAndroid.cpp
  //
  //

  #include
  using std::cin;
  using std::cout;
  using std::endl;
  class MyName
  {
  public:
  void getname( void );
  void sayhello( void );
  private:
  char name[ 255 ];
  };
  void MyName::getname( void )
  {
  cout << "What is your name? ";
  cin >> name;
  }
  void MyName::sayhello( void )
  {
  cout << "Welcome " << name << " to the world of Android" << endl;
  }
  MyName name;
  int main( int argc, char *argv[] )
  {
  name.getname();
  name.sayhello();
  return 0;
  }

Android编译本地C++程序方法

在Android平台上程序以Java形式运行在Dalvik模拟器上,但Android作为一个Linux内核系统完全可以执行Navtive C++程序,主要的步骤如下:

  1.下载ARM C++交叉编译器http://www.codesourcery.com/gnu_toolchains/arm/portal/subscription3057

  2.编写本地C++代码,如Hello Wolrd,可以使用标准库STL。编译的命令行如下

 arm-none-linux-gnueabi-g++.exe -static -oandroid123 android123.cpp

  首先运行arm-none-linux-gnueabi-g++.exe程序-static 参数代表静态库,-o为输出名称android123,最后的android123.cpp为源代码。

  3.运行模拟器,用cmd在sdkTools目录夏之星 adb pushandroid123 /system/sbin/android123

  4.设置访问权限,通过Linux的Shell,在cmd下设置所有用户完全控制权限adb shell chmod 777 /system/sbin/android123

  5.执行这个android123程序,输入adb shell cd /system/sbin/android123即可

在android平台上测试C/C++程序及库

int main( int argc, char *argv[] )
  {
  name.getname();
  name.sayhello();
  return 0;

  android平台上带有标准C库,我们可以写个C程序来试试看能不能在上面运行。。。

  首先下载并安装交叉编译工具GNU/ARM Linux gcc:

  http://www.codesourcery.com/gnu_toolchains/arm/download.html

  安装时 直接解压就行了,要设置好PATH环境变量。

  简单的C代码:

  test.c
  #include <stdio.h>
  int main()
  {
  int i,j;
  for(i=0;i<=10;i++)
  {
  for(j=0;j<=i;j++)
  printf(”*”);
  printf(”n”);
  }
   return 0;
  }

  用刚下载的交叉编译工具编译源代码:

  # arm-none-linux-gnueabi-gcc test.c -o test -static

  -static选项在这里是必须的,不然android平台就不运行此程序。

  这也说明了此平台上的C/C++库是不能被C/C++程序动态连接的 。

  进入tools目录,用adb工具下载到android平台,放到/data/data目录。

  # ./adb push test /data/data

  进入/data/data目录运行程序。

  # cd /data/data

  # ./test

  *

  **

  ***

  ****

  *****

  ******

  *******

  ********

  *********

  **********

  ***********

  ok,It’s done !

  C++程序一样的方法,只不过编译器换成:arm-none-linux-gnueabi-g++

  附C++示例代码:

  //
  // HelloAndroid.cpp
  //
  //
  #include <iostream>
  using std::cin;
  using std::cout;
  using std::endl;
  class MyName
  {
  public:
  void getname( void );
  void sayhello( void );
  private:
  char name[ 255 ];
  };
  void MyName::getname( void )
  {
  cout << “What is your name? “;
  cin >> name;
  }
  void MyName::sayhello( void )
  {
  cout << “Welcome “ << name << ” to the world of Android” << endl;
  }
  MyName name;
  }

  上面的应用程序在编译时必须加上-static选项,也就是在编译时将函数都静态编译到程序中了,运行时不用再动态连接。如果不加此选项,在android平台上就不让运行。

  经过测试,将自己写的库放到/system/lib目录下,然后写个主程序来动态连接,也是无法运行。

  看来此平台做了限制,不让C/C++的程序运行时动态连接到这些C/C++库。

android上进行c/C++开发测试(转)的更多相关文章

  1. Android IOS WebRTC 音视频开发总结(八十三)-- 使用WebRTC广播网络摄像头视频(上)

    本文主要介绍WebRTC (我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:bl ...

  2. Android开发(二十五)——Android上传文件至七牛

    设置头像: Drawable drawable = new BitmapDrawable(dBitmap); //Drawable drawable = Drawable.createFromPath ...

  3. 在Android上运用Anko和Kotlin开发数据库:SQLite从来不是一件轻松的事(KAD25)

    作者:Antonio Leiva 时间:Mar 30, 2017 原文链接:https://antonioleiva.com/databases-anko-kotlin/ 事实告诉我们:在Androi ...

  4. Android上方便地开发的C程序

    假设你基于没有一个专门的开发板练手.那你的Android手机也能够开发大多数C应用程序.安装好后编译C的编译器. 本文仅仅写一个Hello World的执行过程. 长处是:不须要eclipse,不须要 ...

  5. 准备开发一个运行在Android上的JavaME模拟器

    在一个虚拟机A上运行另外一个虚拟机B看起来是挺不靠谱的一件事,在手机上运行某个虚拟机也不怎么靠谱.并且如果虚拟机A运行在手机上这个听起来就更不靠谱了.但是很多人就在做这样的事.比如在在手机上运行DOS ...

  6. TensorFlow 在android上的Demo(1)

    转载时请注明出处: 修雨轩陈 系统环境说明: ------------------------------------ 操作系统 : ubunt 14.03 _ x86_64 操作系统 内存: 8GB ...

  7. Android IOS WebRTC 音视频开发总结(八十五)-- 使用WebRTC广播网络摄像头视频(下)

    本文主要介绍WebRTC (我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:bl ...

  8. Android上的MVP:如何组织显示层的内容

    MVP(Model View Presenter)模式是著名的MVC(Model View Controller)模式的一个演化版本,目前它在Android应用开发中越来越重要了,大家也都在讨论关于M ...

  9. ZT 理解 Android 上的安全性

    理解 Android 上的安全性 http://www.ibm.com/developerworks/cn/xml/x-androidsecurity/ 利用沙箱.应用程序签名和权限增强应用程序安全性 ...

随机推荐

  1. 正则表达式校验15/18位生份证-JAVA版

    public static boolean isIDNumber(String iDNumber) { if (iDNumber == null || "".equals(iDNu ...

  2. 在进行form提交时,根据form的选择,在javascript中进行特定提交

    1.html代码片段 <form name="form1" method="post" action=""> <selec ...

  3. C#调用DLL各种传参

    C++#define JNAAPI extern "C" __declspec(dllexport) // C方式导出函数 typedef struct { int osVersi ...

  4. 【PPT详解】曹欢欢:今日头条算法原理

    [PPT详解]曹欢欢:今日头条算法原理 悟空智能科技 4月8日 公众号后台回复:“区块链”,获取区块链报告 公众号后台回复:“sq”,进入区块链分享社群 热文推荐: 1000位专家推荐,20本区块链必 ...

  5. spring中ApplicationContextAware接口使用理解

    一.这个接口有什么用?当一个类实现了这个接口(ApplicationContextAware)之后,这个类就可以方便获得ApplicationContext中的所有bean.换句话说,就是这个类可以直 ...

  6. 第二章 JVM内存分配

    注意:本篇博客,主要参考自以下四本书 <分布式Java应用:基础与实践> <深入理解Java虚拟机(第二版)> <突破程序员基本功的16课> <实战java虚 ...

  7. 2.6 《硬啃设计模式》第8章 复制不是很难 - 原型模式(Prototype Pattern)

    案例: 某即时战略游戏,你训练出来各种很强的战士. 为了增加游戏的可玩性,增加了一种复制魔法.实施该魔法,可以复制任意的战士. 你会怎样考虑这个设计? 在继续阅读之前,请先认真思考并写出你的设计,这样 ...

  8. Longest Consecutive Sequence leetcode java

    题目: Given an unsorted array of integers, find the length of the longest consecutive elements sequenc ...

  9. Jquery 获取第一个子元素

    <ul>  <li>John</li>  <li>Karl</li>  <li>Brandon</li></u ...

  10. 理解 CSS 的 z-index 属性

    通常认为HTML页面是二维的,但实际上,CSS还有一个z-index属性,允许层叠元素. 所有的盒模型元素都处于三维坐标系中. 除了我们常用的横坐标和纵坐标, 盒模型元素还可以沿着“z轴”层叠摆放, ...