下载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
中项目设置
通过AS(=Android Studio)新建空Activity项目, 在AS的Project视图中切换到Project
模式, 建立需要的jni
目录和jniLibs
目录
并且打开根目录的local.properties
, 添加如下内容, 目录指向你在上一步设置的ndk文件夹
ndk.dir=/path/to/your/ndk/folder
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
最后效果如下