NDK的介绍
NDK–Native Development Kit,支持android平台开发C/C++,android平台是由java语言开发的,为什么需要用到C/C++呢?主要的原因是java已经无法满足android的开发,例如底层库的开发–opencv。
NDK提供了一系列的工具,帮助开发C/C++的动态库,并将.so和java应用打包成apk.
JNI的介绍
JNI–java Native Interface,它不是android专有的东西,它是从java继承过来的,JNI的作用是连接java和C/C++层的关键。
NDK开发环境的搭建
- 下载安装 android ndk,建议下载最新的,然后解压
【注意:ndk-7之后,不需要再单独安装cygwin,已经集成了cygwin】 - 配置NDK环境
进入”环境变量“,如下图
“新建”NDK_HOME =”[ndk的目录路径]”,如下图
然后在path添加%NDK_HOME%
- 测试安装成功
进入ndk路径下找到一个sample的目录,进入该目录下,如下图
再DOS终端下进入hello-jni的路径下,输入ndk-build,出现下图则安装成功
然后在该目录下多了2个文件夹
android之使用ndk
- 在app/build.gradle下添加如下的代码:
defaultConfig {
ndk{
moduleName "LoadLib"
}
}
task ndkBuild(type:Exec,
group:'ndk') {
commandLine "ndk-build.cmd", '-C', file('src/main').absolutePath
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn ndkBuild
}
- 在gradle.properties文件声明NDK的支持
android.useDeprecatedNdk=true
- 在工程属性设置好NDK的路径,如下:
- 创建一个android工程,然后创建一个native类,如下:
package com.hodi.hodi_opencv;
/**
* Created by AA on 2016/11/7.
*/
public class LoadLib {
static {
System.loadLibrary("LoadLib");
}
public static native String gray();
}
然后make project一下,目的是编译成对应的class文件,然后根据生成的class文件,利用javah生成对应的.h头文件
- 在app/main下创建jni目录,如下图:
- 在android Studio下的Terminal下进入main下,输入命令
javah -d jni -classpath E:\work\Andriod\Hodi_Opencv\app\build\intermediates\classes\debug com.hodi.hodi_opencv.LoadLib
将生成一个头文件“com_hodi_hodi_opencv_LoadLib.h”,内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
#include <string.h>
/* Header for class com_hodi_hodi_opencv_LoadLib */
#ifndef _Included_com_hodi_hodi_opencv_LoadLib
#define _Included_com_hodi_hodi_opencv_LoadLib
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_hodi_hodi_opencv_LoadLib
* Method: gray
* Signature: ([III)[I
*/
JNIEXPORT jstring JNICALL Java_com_hodi_hodi_1opencv_LoadLib_gray
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
- 生成实现头文件的C/C++文件,如下:
#include "com_hodi_hodi_opencv_LoadLib.h"
//
// Created by AA on 2016/11/8.
//
JNIEXPORT jstring JNICALL Java_com_hodi_hodi_1opencv_LoadLib_gray
(JNIEnv * env, jobject obj){
return (*env)->NewStringUTF(env, "Hello ! Compiled with ABI ");
}
- 在jni下创建android.mk,内容如下:
# Copyright (C) 2009 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := LoadLib
LOCAL_SRC_FILES := LoadLib.c
include $(BUILD_SHARED_LIBRARY)
- 测试native方法
package com.hodi.hodi_opencv;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import static com.hodi.hodi_opencv.LoadLib.gray;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = (TextView) findViewById(R.id.tv_1);
tv.setTe`
t(gray());
}
}
GitHub:https://github.com/lidc-lee/OpenCV_Demo.git
参考博客:http://www.coin163.com/it/x6380265991832689305/OpenCV-JNI-AndroidNDK
学习资料:http://blog.csdn.net/linjingke32/