个人感觉在AndroidStudio中开发NDK有点麻烦,不如在VS中开发高效简单,
可以参考《VS+VA搭建顺手的NDK集成开发环境》,后面转了这篇文章,同时添加了一些新的高效方法;
不过目前VS2015支持Android,IOS库开发,如果为了更加的方便,可以用VS2015,开发NDK,还默认包含了上述的方法;后面讲解;
JNI dir;
NDK
jni.srcDirs = []
jniLibs.srcDirs =['src/main/libs']
或者直接在main目录下建立jniLibs目录;
mk
LOCAL_PATH:= $(call my-dir) # include $(CLEAR_VARS) LOCAL_MODULE := hello LOCAL_SRC_FILES := F:\hello\jni\libhello.so LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/tools/include include $(PREBUILT_SHARED_LIBRARY) # include $(CLEAR_VARS) LOCAL_MODULE := hello-jni LOCAL_CFLAGS := -std=c++11 -fexceptions LOCAL_LDLIBS := -llog LOCAL_SHARED_LIBRARIES := libhello LOCAL_SRC_FILES := mainactivity.cpp include $(BUILD_SHARED_LIBRARY)
2:
#APP_PLATFORM := android-9 APP_ABI := armeabi-v7a #APP_STL := stlport_static APP_STL := gnustl_shared APP_GNUSTL_FORCE_CPP_FEATURES := exceptions rtti
4:ndk-build.cmd
cd .. ndk-build
5: javah.cmd ,main dir execute;
javah -d jni -classpath D:\android_sdk\platforms\android-22\android.jar;D:\android_sdk\extras\android\support\v4\android-support-v4.jar;D:\android_sdk\extras\android\support\v7\appcompat\libs\android-support-v7-appcompat.jar;..\..\build\intermediates\classes\debug com.example.administrator.myapplication.MainActivity
这主要是因为native函数写到MainActivity中了,所以用javah命令的时候需要将用到的jar全部写上;一般强烈建议,重新写一个类声明native函数,这样javah命令比价简单,然后在相关的地方用这个类对象就可以了;
《VS+VA搭建顺手的NDK集成开发环境》
工欲善其事,必先利其器。
VS+VA有高效的提示,而且VS的IDE非常好用;如果没有特殊要求,通常的代码编写,个人建议用这个方法;
Android NDK开发环境,可选择VIM+插件、Eclipse+CDT等,这里介绍另一种选择:VS+VA
软件准备:
Visual studio 2008 // 其他版本也行,这里以VS2008为例。
Visual assist X
Android NDK
环境变量:
将NDK根目录加入%PATH%环境变量。
打开VS2008,新建Makefile项目 (中文版:生成文件项目)
在项目向导中填写以下内容
Build command line: ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk
Clean commands: ndk-build clean NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk
Rebuild command line: ndk-build -B NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk
Include search path: E:\Android\android-ndk-r9d\platforms\android-12\arch-arm\usr\include // 对应到你本机的目录及版本。
点击完成。
这些设置可以在工程属性中修改;Debug、Release可以分别设置。
写代码测试一下
试试编译、清理、重新编译有无问题。
搞定,开始愉快的写代码吧。
{
为了简便,可以直接将NDK的sample中的\hello-jni\jni目录下的文件,mk + c文件全部copy到刚才新建的工程目录下;
然后右键添加这些文件;
然后F7,直接编译就得到Android上运行的so文件了;
}
新添加:通过javah命令行生成JNI的.h头文件后,可以通过VC助手,右键创建cpp文件(Create File),然后创建函数实现;
非常高效方便;
新添加:如果还想执行别的命令或程序或bat文件,可以在调试->命令:中输入文件路径,执行就可以了;
当然,用简单优化一下上述命令行路径,添加jni文件夹到工程目录,然后添加文件到目录, 包括mk文件,这样也就可以比人直接命令行编译了;
因为NDK的编译文件必须在jni文件夹中;(但是好像在jni文件夹中,所有类型的so都编译了,这样效率有点慢,而且最后还有一个错误,虽然不影响,但是不好看 ,具体更好的方法用下面讲的“VS2015 NDK 开发”)
当然,如果不想这么修改,给别代码的时候,需要将工程下的代码,复制到jni文件夹中才可以ndk-build编译;
VS2015 NDK 开发:
vs2015的安装,一定要安装想的VS2015中的NDK包,里面包含了微软的一些mk文件,我们可以参考,写我们的mk文件;
其中Android的sdk如果自己有,可以不用安装,在tools-》Options-》Cross Platform -》C++:这个页面中配置;
在VS2015中开发Android的NDK有几种方法;
方法一:
上面讲解的手动配置VS2010的NDK开发,但是在VS2015中,只需要直接生成相关工程就可以有上面的配置了;
New Project -》Templates -》 Visual C++ -》Windows -》Cross Platform -》Makefile Project(Android);
这样就生成了Android的可以通过mk文件编译NDK的工程;
我们可以将NDK中的例子的JNI文件夹直接复制到新建的工程目录下编译就可以了;
为了方便,可以将相关文件直接右键添加到工程中,方便查看编写;
自己建立的jni目录中没有mk文件,vs2015会调用 ProgramData\Microsoft\AndroidNDK\android-ndk-r10e\build\core 中的mk文件,编译默认名为lib.a的库文件;
看了上述描述,是不是很方便!
如果VS2015的VC助手有了,那么用VS2015就非常方便了;
方法二:
直接选择 Dynamic Shared Library(Android),或者 Static Library(Android),软后添加自己的h文件和cpp文件就可以编译相关的Android 的 NDK库了;
这个方法不需要mk文件,VS内部已经根据相关配置编译了,相当于有mk配置编译文件了;
这个方法中编写NDK就和编写一般的vc工程基本上一样了;
在VS2015中的Android java代码编写插件;
一般安装完成VS2015后,编写Android的Java代码,java代码没有提示,也没有函数自动提示补充;
这个时候需要一个插件,相当于MFC中的VC助手: Java Language Service for Android and Eclipse Android Project Import
地址:https://visualstudiogallery.msdn.microsoft.com/53e6e65b-fa0f-411a-a98d-7911009537ac
VS2015中的一些调试问题:
用vs2015开发Android程序的时候(库文件,或者native,或者java Android)一般可以在IDE上面直接看到目前连接的Android设备,编译完成后执行,自动安装到目标机器;但是有一天,突然无法找到设备了,但是设备确实连接,而且360助手可以看到,所以一定是配置出现问题了;
解决方法:将Android sdk中的 Android\sdk\platform-tools 和 Android\sdk\tools 目录配置到系统的环境变量path中就可以了;
今天开机又发现vs2015不能发现Android设备了,于是上网一查,原来是我的360手机助手连接了设备,将360手机助手断开连接,重启vs2015就可以了;
同理,豌豆荚等手机助手工具如果连接了设备,vs2015也无法找到Android设备;但是Androidstudio没有问题;
2:
在vs2015中,Android的编译有两个选项,有Native Only 和 Java Only;
其实目的就是一个调试的本地代码(就是C或者C++的那个库文件代码),一个是java文件代码;
3:
添加库;
添加新的的so库到pack文件夹,这样可以打包道APK;
javaloadlibrary;这句话要放到当前so库的前面loadlibrary;
4:
vs2015 updat1; 后续版本有问题;
5:一些微软官方文章:
介绍:
https://www.visualstudio.com/explore/msft-android-emulator-vs
示例:
https://www.visualstudio.com/explore/cplusplus-mdd-vs.aspx
https://msdn.microsoft.com/library/dn707591.aspx
https://msdn.microsoft.com/zh-cn/library/dn707596.aspx
当然Qt也可以(最新版本),不过还是觉得VS方便,Qt和VS2015的的“方法二”差不多;
so:
外部库;
当前目录下;