Android-NDK编译

(2013-12-19  21:48:21 其实一切还是先看看官网的好,乱百度浪费时间....

http://developer.android.com/tools/sdk/ndk/index.html#Installing  )

(开始..这个文章只有最后的总结算笔记,其他废话)

话说移动设备交叉编译还真是麻烦....

看cocos2d-x 环境搭建 ,基本上都是推荐安装 cygwin.

因为两年前的幼稚经验,对这个东西实在是心里畏惧,加上偶尔交叉编译点东西都是用MingW,就进行了以下尝试:

1.  给MinGW环境变量加上NDK路径

      找到MinGW安装目录下的  /etc/profile 

  在最后加上这么一句: 

  export PATH="/e/T_GIT/android_dep/android-ndk-r8e:$PATH"

     MinGW访问驱动器用 “/” 开头,并且没有“:” 。对应的实际路径是 :E:T_GITandroid_depandroid-ndk-r8e

     在MinGW环境下输入命令进行验证:

ezhong@bj-ezhong ~
$ ndk-build
Android NDK: Could not find application project directory !
Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.
/e/T_GIT/android_dep/android-ndk-r8e/build/core/build-local.mk:130: *** Android
NDK: Aborting    .  Stop.

ezhong@bj-ezhong ~

     这样就证明MinGW的NDK环境变量配置好了.

2.   编译NDK sample :hello-jni

     从 E:T_GITandroid_depandroid-ndk-r8esamples 下拷贝 hello-jni到任意目录

     比如我的是 E:T_GITeclipsehello-jni

     MinGW中进入hello-jni目录,执行ndk-build 命令:

ezhong@bj-ezhong /e/T_GIT/eclipse/hello-jni
$ ls
AndroidManifest.xml  default.properties  jni  res  src  tests

ezhong@bj-ezhong /e/T_GIT/eclipse/hello-jni
$ ndk-build
Gdbserver      : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver
Gdbsetup       : libs/armeabi/gdb.setup
Cygwin         : Generating dependency file converter script
Compile thumb  : hello-jni <= hello-jni.c
SharedLibrary  : libhello-jni.so
Install        : libhello-jni.so => libs/armeabi/libhello-jni.so

ezhong@bj-ezhong /e/T_GIT/eclipse/hello-jni

     hello-jni目录下多了libs 、obj 两个文件夹.

     libs下有生成的so文件

3  编译错误

    将jni文件拷贝到一个eclipse生成的android项目下,再次调用ndk-build的时候出现如下错误

ezhong@bj-ezhong /e/T_GIT/eclipse/andTest1
$ ndk-build
Invalid attribute name:
    package
/e/T_GIT/android_dep/android-ndk-r8e/build/gmsl/__gmsl:512: *** non-numeric seco
nd argument to `wordlist' function: ''.  Stop.

ezhong@bj-ezhong /e/T_GIT/eclipse/andTest1
$

  查了些资料,竟然有的这样的解决方法:

  http://blog.csdn.net/devilkin64/article/details/9144355

解决方法:
找到NDK中的这个__gmsl文件,并将其中第518行:
int_encode = $(__gmsl_tr1)$(wordlist 1, ,$(__gmsl_input_int))修改为 
int_encode = $(__gmsl_tr1)$(wordlist 1,$(words ),$(__gmsl_input_int))

  不理解啊...

      同样一份jni代码,放入一个工程就不行了?

      http://blog.csdn.net/jiuyueguang/article/details/9465305 有提示..原来是 AndroidManifest.xml 搞怪.

      去掉AndroidManifest.xml果然可以编译通过.

      看到各个大神们的 dos2unix 、fromdos  等转换工具 ,windows真是伤不起啊.

      最后搜到个很少办法的办法..先把 AndroidManifest.xml挪走或者改名,编译完再恢复...太高级了.

总结:

  最激动人心的时刻到了....

     以上都是废话....

     NDK本身有提供windows的ndk-build脚本...

     只要将 安装目录 如“E:T_GITandroid_depandroid-ndk-r8e”  设置到windows系统环境变量PATH中.

     直接在CMD中,切入到目标目录,ndk-build即可....

E:T_GITeclipseandTest1>ndk-build
"Compile thumb : ejni <= ejni.c
SharedLibrary  : libejni.so
Install        : libejni.so => libs/armeabi/libejni.so

E:T_GITeclipseandTest1>

  太容易把自己绕死...

   另: javah 找不到 android.app.Activity 用 

  -bootclasspath E:T_GITandroid_depadt-bundle-windows-x86-20130717sdkplatformsandroid-17android.jar 

  参数指定,貌似与直接用src下的 Java文件生成的差不多..

   

原文地址:https://www.cnblogs.com/ezhong/p/3480380.html