Keep on going, never give up.

NDK原生测试过程

我们在做NDK开发时,其编译结果要做作为个共享库存在,要么本身就是个可执行档,共享库既可以起到核心代码安全保护作用,又可以提高核心代码的执行效率,模块分工只需提供给上层JAVA主程序控制接口即可。如果你的共享库代码较多,依赖关系较为复杂时,就不得不要先写个main函数在Android系统下进行测试(真机环境)。本文就是介绍NDK可执行档的测试过程,尽管NDK自带的samples编译测试都很简单,但是涉及模拟器测试时常会遇到几个问题,故流程和错误为本文重点。

Ubuntu下NDK环境搭建方法:Ubuntu下NDK环境搭建

Windows下NDK环境搭建方法:Windows环境下Android NDK环境搭建

本文测试环境:Ubuntu 12.04 i386 + android-ndk-r8c

一、编译原生程序

该程序可以直接来源于NDK安装包下的samples目录下hello-jni和native-xxx。

1、删除AndroidManifest.xml,本文仅测试标准的C/C++程序,不需这个。

2、修改jni/Android.mk中的include $(BUILD_SHARED_LIBRARY)为include $(BUILD_EXECUTABLE)

3、如果源文件名称被修改为helloworld,请确认jni/Android.mk中的LOCAL_MODULE和LOCAL_SRC_FILES参数名对应修改。

3、jni/xxx.c文件增加

#include <stdio.h>

int main(int argc, char *argv[])
{
  printf("Hello World\n");
  return 0;
}

修改完成保存,使用NDK编译helloworld,最后得到/obj/helloworld可执行文件。

二、测试原生程序

1、把helloworld编译结果拷贝到sdk/platform-tools目录,如果有原生共享库.so可PUSH到如下路径,系统会在软件运行时自动加载。

  • /data下软件的共享库,一般在/data/data/pkg_name/lib/
  • /system/app下软件的共享库,一般在/system/lib/plugins/pkg_name/

2、打开终端,查看当前ANDROID设备

  • ./adb devices

3、拷贝helloworld到Android设备SD卡下

  • ./adb shell mkdir /data/helloworld
  • ./adb push helloworld /data/helloworld/

4、进入模拟器SHELL状态:

  • ./adb shell
  • root@android:/ #

5、修改执行权限

  • chmod -R 777 /data/helloworld/

6、运行测试:

  • /data/helloworld/helloworld

7、退出模拟器SHELL状态

  • exit;

三、常见错误

push文件到/system/lib下时可能遇到两个错误。

错误1:报告Read-only file system

解决办法,依次执行:

  • adb remount
  • adb shell
  • chmod 777 system
  • chmod 777 system/lib

四条命令提权即可。当然这四条命令也不是对所有设备都有效,发现无效再想别的办法:)。

Android获取ROOT权限方法汇总

 

错误2:No space left on device或Out of memory

解决办法: 不要使用Eclipse or AVD Manager来启动模拟器,而使用如下命令行进行:

  • #./tools/emulator -avd youravdname -partition-size 512 -memory 512

备注:其中youravdname要改成你的虚拟机名称,emulator程序在sdk/tools目录下。后面的-partition-size和-memory值也不能太小,太小还是会报告Out of memory错误。

相关评论(0):  

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

订阅博客

最新文章

本站采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载也必须遵循“署名-非商业用途-保持一致”的创作共用协议. 返回顶部
Copyright@2005-2016 Metsky.com, All rights Reserved.