天天看点

Mac下安装NDK,进行JNI开发

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,则:

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开发