Android Studio & NDK on Mac OS X - All About Free

  1. 下载ndk

    从官方网页 https://developer.android.com/tools/sdk/ndk/index.html 下载mac版本的ndk, 一般为android-ndk-r10d-darwin-x86_64.bin, 然后解压缩

    bash
    chmod a+x android-ndk-r10d-darwin-x86_64.bin
    ./android-ndk-r10d-darwin-x86_64.bin


    获得名为android-ndk-r10d的目录, 放到想要的目录中即可, 我放在了~/Android_ndk

  2. 项目设置

    通过AS(=Android Studio)新建空Activity项目, 在AS的Project视图中切换到Project模式, 建立需要的jni目录和jniLibs目录


    并且打开根目录的local.properties, 添加如下内容, 目录指向你在上一步设置的ndk文件夹

    ndk.dir=/path/to/your/ndk/folder

  3. Hello World from jni

    配置AS支持直接调用javah, 方便生成对应类的头文件

    AS选择Preferences->External Tools

    增加一个新的Tool, 如下配置


    Program填写/usr/bin/javah, Parameters填写-v -jni -d $ModuleFileDir$/src/main/jni $FileClass$, Working directory填写$SourcepathEntry$

    现在修改我们的MainActivity, 申明我们需要的函数, 如hello()

java
static{
        System.loadLibrary(“hello”);
    }
private TextView textView ;
public native String hello();

 @Override
    public void setContentView(int layoutResID) {
        super.setContentView(layoutResID);
        textView = (TextView) findViewById(R.id.textview);
        textView.setText(hello());
    }

然后就可以使用这个工具方便的创建我们需要的头文件啦, 右键选择MainActivity, 选择javah工具, lib文件夹中就会生成package_name_class_name.h的头文件, 也就是我们的sh_rui_demo_project_opencv_MainActivity.h, 内容大致如下

// sh_rui_demo_project_opencv_MainActivity.h
/* DO NOT EDIT THIS FILE - it is machine generated */
 #include <jni.h>
/* Header for class com_android_hacks_ndkdemo_MyActivity */

 #ifndef _Included_sh_rui_demo_project_opencv_MainActivity
 #define _Included_sh_rui_demo_project_opencv_MainActivity
 #ifdef __cplusplus
extern “C” {
 #endif
/*
 * Class:     sh_rui_demo_project_opencv_MainActivity
 * Method:    hello
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_sh_rui_demo_project_opencv_MainActivity_hello
  (JNIEnv *, jobject);

 #ifdef __cplusplus
}
 #endif
 #endif
然后在`jni`文件夹中创建`main.c`, 引用生成的头文件, 并且实现对应的函数`hello()`
// main.c
 #include “sh_rui_demo_project_opencv_MainActivity.h”
JNIEXPORT jstring JNICALL Java_sh_rui_demo_project_opencv_MainActivity_hello (JNIEnv * env, jobject obj){
        return (*env)->NewStringUTF(env, “Hello from JNI”);
}

最后在build.gradle中调用ndk即可

defaultConfig {
        applicationId “sh.rui.demo.project.opencv”
        minSdkVersion 9
        targetSdkVersion 21
        versionCode 1
        versionName “1.0”
        ndk{
            moduleName “hello”
        }
    }

需要注意的是, moduleName需要和Activity中调用的库名一样, 如本文中的hello

最后效果如下

Free /
Published under (CC) BY-NC-SA in categories technology