标签:ndk
在Android应用的开发工程中,不管是游戏还是普通应用,都时常会用到.so即动态链接库,关于.so是什么玩意儿,有什么好处,这个大家可以在网上查一下,本人不做过多解释。.so本是linux下的文件类型,所以编译.so必须要在linux环境下,那么如何在win下进行编译呢?随便在网上搜下,教程也是五花八门,不清不楚,没有一定功底,即便看着教程到最后估计还是功败垂成,更别说初学者,看了保证头晕眼花,本人也是根据网上的一些例子,总结了一个个人认为还算比较简单的一个.so的编译方法:GNUstep(网上有不少用cygwin的,大家也可以去研究下)。
进入正题,win下.so开发环境搭建:(由于资源在网上不太好找,于是本人将需要的工具都放进了网盘)
1.NDK(本NDK版本为10):链接: http://pan.baidu.com/s/1bn1xDQB 密码: lr7d
2.gnustep-core-0.34.0-setup.exe,gnustep-devel-1.4.0-setup.exe,gnustep-msys-system-0.30.0-setup.exe 链接: http://pan.baidu.com/s/1ntLwd53 密码: kuuj
下载并安装完毕后(安装路径默认即可):
首先,在eclipse中导入NDK所在路径(解压完毕后的路径)
然后,在c盘(本人的安装路径在c盘),找到文件GNUstep.conf并打开以配置环境变量:
在该文件最后两行添加或修改:(注意你NDK的路径)
NDK=E:/baiyuliang/android-ndk-r10 export=NDK打开GNUstep,并输入make -v,确定(enter键),再输入gcc -v,出现如下图症状:
输入cd $NDK,出现又出现下图症状:
则表示开发环境已搭建成功!
好了,接下来我们做一个简单的例子以学习如何使用GNUstep来做NDK的开发:
在eclipse中创建一个项目工程,包名:com.byl.testjni,主类名MainActivity(这个要看清楚,接下来会要求你正确输入他们的路径和名称):
创建完毕后,打开cmd,输入javah命令运行:
出现如图显示,则表示一切顺利,可继续往下进行,如果出现找不到该命令,则要检查下你的jdk环境变量是否配置正确。
接下来,定位到该工程项目中src文件夹硬盘中的所在路径:
打开项目中的MainActivity,加入以下代码:
public native String hello();//定义.so中的方法名 static{ System.loadLibrary("testJni");//定义生成的.so的名称 }这个是需要事先写在调用.so的Activity中的,在编译时会自动在头文件中生成定义的方法名,以及最后生成的.so名称,接下来在cmd中输入以下命令,生成c头文件:
javah -d ../jni com.byl.testjni.MainActivity千万注意路径不要写错,确定后,如果什么都没提示,则表示执行成功,eclipse中右键-刷新项目:
然后在jni文件夹中创建一个c文件,名称为与.so名称一致,即testJni.c:
接下来,仍在jni文件夹中编写Android.mk文件,Android.mk文件可在NDK安装路径下的samples/hello-jni/jni中找到,直接复制过来:
打开Android.mk,并修改其中的LOCAL_MODULE和LOCAL_SRC_FILES:
LOCAL_MODULE是描述模块的,用来给java调用的模块名,会生成对应的libtestJni.so;
LOCAL_SRC_FILES是源文件,多个文件空格隔开即可;
关键的一步来了,打开GNUstep,开始编译并生成.so文件:
1.输入命令,定位到项目(TestJni)所在位置:
cd /E/AndroidProject/TestJni2.输入命令,生成testJni.so文件:
$NDK/ndk-build
下面就是见证奇迹的时刻:
打开MainActivity,在Oncreate方法中,调用hello()方法并打印,如果显示”HelloJni!“即表示.so生成无误并且调用成功!
Log.e("jj", hello());运行,看LogCat:
OK!完美运行!
此后,就可以把一些重要的变量,或者服务地址什么的放在.so里面了,然后将生成的.so放进项目就可以使用啦!
PS:这个例子很简单,就是打印一字符串,跟实际应用开发中所要编写的复杂的方法等相错甚远,所以真正学会NDK开发还需要下苦功夫的!
注意事项:
有童鞋可能用这个例子上生成的.so直接放在其它项目上使用时出现调用方法不成功的问题,在这里告诉大家一下,编译.so时所使用的Activity路径一定要与项目中调用.so中方法的Activity路劲一致,比如:A项目中的AActivity要调用一个.so,那么可以直接在本项目中生成.so,如果另创建一个单独的项目如B项目去生成.so时,那么B项目中Activity路径要与A完全一样:
A项目:com.byl.testjni.AActivity,
那么B项目也必须为:com.byl.testjni.AActivity
demo源码:http://download.csdn.net/detail/baiyuliang2013/8505977
标签:ndk
原文地址:http://blog.csdn.net/baiyuliang2013/article/details/44306921