Android studio 集成NDK开发环境,只要设置ndk路径。如果使用eclipse bundle开发,没有NDK插件,需要导入jar包,和ADT插件一样。如果下载JavaEE for mac 64位,需要安装ADT插件才能开发android应用。下面介绍Mac下安装如何NDK,进行JNI开发。
为什么用AS开发,还要Eclipse帮衬?
有些项目是eclipse的,用它来阅读项目源码或许有些必要,重要的是,我觉得它的NDK比Android Studio要成熟一些。所以还是要折腾下Eclipse NDK开发环境。
eclipse可以方便的为项目添加本地支持,add Native Support,然后就可以识别c/c++代码了,而且可以自定义编译命令,确实比较方便。开发的时候最头痛的就是一片红。
一,Eclipse+NDK开发工具下载
1,Eclipse for Android &ADT bundle
链接: http://pan.baidu.com/s/1ge3pqs7 密码: vbfw
里面有mac和windows平台的eclipse:adt-bundle-mac-x86_64-20140702
2,Eclipse的ndk插件和NDK for mac
链接: http://pan.baidu.com/s/1dF6XyVZ 密码: x3jv
版本为:android-ndk-r11b-mac-x86_64,ndk插件为jar包。
二,安装NDK,配置NDK路径和环境变量
1,安装NDK for mac
找到ndk的安装包位置,进入该路径,然后提升操作权限,用./解压。例如:
cd /Users/duqian/android-ndk
chmod a+x android-ndk-r10c-darwin-x86_64.bin
./android-ndk-r10c-darwin-x86_64.bin
2,配置ndk路径
Android studio 设置ndk路径,File>Project Structure>SDK Location 设置SDK,JDK,NDK路径即可。
eclipse解压出来就可以使用,在首选项里面,设置ndk路径。如果没有ndk的插件选项,就把ndk插的jar包,直接放到eclipse根目录的plugins目录下面。重启eclipse生效。然后重新设置。
需要注意的是,添加本地支持后,如果ndk路径改变,那么原来jni目录中,很多头文件就找不到了,因为Eclipse记住了这些文件的路径。可以删除eclipse隐藏文件里面的一些内容,最好是删除重新导入一次项目,或者重新构建。
3,添加ndk环境变量
请看我的另一文章: mac下配置JDK,SDK,NDK和ADB环境
三,终端使用ndk命令
1.生成头文件.h
cd到项目的path/to/project/src目录下使用javah命令。
cd /Users/duqian/AndroidMac/eclipse2016/HelloJNI/src
javah -jni com.example.hellojni.MainActivity
在项目project/bin/classes目录下使用javah命令,容易出错!
DuQian-MBP:classes duqian$ javah -jni com.example.hellojni.MainActivity
错误: 无法访问android.app.Activity
找不到android.app.Activity的类文件
不要傻傻的自己写头文件,低效又容易出错。
2.ndk-build
ndk-build命令可以编译jni目录中的文件为.so库文件。然后就可以给android调用了。
cd /Users/duqian/AndroidMac/eclipse2016/HelloJNI/jni
ndk-build
四,JNI开发,NDK项目实战
也可以看我的另一文章:Android JNI技术, NDK开发
1,jni目录写c代码,这里不使用生成的头文件,直接写。返回字符串给andoird调用:
#include <string.h>
#include <jni.h>
jstring Java_com_example_hellojni_MainActivity_stringFromJNI(JNIEnv* env, jobject thiz)
{
return (*env)->NewStringUTF(env, "Hello from JNI!");
}
2,Android.mk配置文件
eclipse中在项目中add Native Support后,jni目录自动生成,其中就有这个文件。简单配置下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-ndk
LOCAL_SRC_FILES := hello-ndk.c
include $(BUILD_SHARED_LIBRARY)
3,android调用c代码:
public class MainActivity extends Activity {
// 声明本地方法,位于hello-ndk.c
public native String stringFromJNI();
static {
System.loadLibrary("hello-ndk"); //导入编译后的.so库
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
TextView tv = new TextView(this);
tv.setText(stringFromJNI()); //android 调用c语言返回的字符串
setContentView(tv);
}
}
4,Application.mk文件
常用的是APP_ABI,交叉编译为对应平台的.so库文件。
#注释NDK的编译系统根据 "armeabi" ABI生成机器代码。
APP_ABI := armeabi
比如:为了在ARMv7的设备上支持硬件FPU指令。可以使用 APP_ABI := armeabi-v7a
如果是x86,则:
APP_ABI := x86
Application.mk文件目的是描述在你的应用程序中所需要的模块(即静态库或动态库)。
Application.mk文件通常被放置在
PROJECT/jni/Application.mk下,
PROJECT指的是您的项目。
五,NDK开发注意事项
Android.mk文件是GNU Makefile的一小部分,用来对Android程序进行编译。 因为所有的编译文件都在同一个 GNU MAKE 执行环境中进行执行,而Android.mk中所有的变量都是全局的。因此,您应尽量少声明变量,不要认为某些变量在解析过程中不会被定义。
Java代码中使用native关键字标示方法是JNI库中的函数,编译出来的JNI库的名字是会加上lib,按照规范,System.loadLibrary中的参数是去掉lib和.so的。
未完待续,杜工,Dusan,Q291902259Mac下安装NDK,进行JNI开发