Android Studio JNI + NDK

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开发环境的搭建

  1. 下载安装 android ndk,建议下载最新的,然后解压
    【注意:ndk-7之后,不需要再单独安装cygwin,已经集成了cygwin】
  2. 配置NDK环境
    进入”环境变量“,如下图
    这里写图片描述

“新建”NDK_HOME =”[ndk的目录路径]”,如下图
这里写图片描述

然后在path添加%NDK_HOME%

  1. 测试安装成功
    进入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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值