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
在最后加上这么一句:
1
|
export
PATH= "/e/T_GIT/android_dep/android-ndk-r8e:$PATH" |
MinGW访问驱动器用 “/” 开头,并且没有“:” 。对应的实际路径是 :E:\T_GIT\android_dep\android-ndk-r8e
在MinGW环境下输入命令进行验证:
1
2
3
4
5
6
7
8
|
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_GIT\android_dep\android-ndk-r8e\samples 下拷贝 hello-jni到任意目录
比如我的是 E:\T_GIT\eclipse\hello-jni
MinGW中进入hello-jni目录,执行ndk-build 命令:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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的时候出现如下错误
1
2
3
4
5
6
7
8
9
|
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
1
2
3
4
|
解决方法: 找到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_GIT\android_dep\android-ndk-r8e” 设置到windows系统环境变量PATH中.
直接在CMD中,切入到目标目录,ndk-build即可....
1
2
3
4
5
6
|
E:\T_GIT\eclipse\andTest1>ndk-build "Compile
thumb : ejni <= ejni.c SharedLibrary
: libejni.so Install
: libejni.so => libs/armeabi/libejni.so E:\T_GIT\eclipse\andTest1> |
太容易把自己绕死...
另: javah 找不到 android.app.Activity 用
-bootclasspath E:\T_GIT\android_dep\adt-bundle-windows-x86-20130717\sdk\platforms\android-17\android.jar
参数指定,貌似与直接用src下的 Java文件生成的差不多..