Android Studio如何在项目中使用jni以及OpenCV库

Android Studio如何在项目中使用jni以及OpenCV库

由于公司这一个项目是将之前运行在Linux上的代码移植到Android上,所以需要学习使用jni将原来的C++代码打包成so库,然后在Android调用,本人百度、Google了许多资料,终于搞定了,分享给各位需要使用jni的程序猿们,好了,废话不多说,开始搞起。

在开始配置前,大家需要下载Android Studio(以下简称AS)、ndk、OpenCV,解压安装我就不再赘述了

  • AS下载链接:http://www.android-studio.org/
  • ndk下载链接:http://developer.android.com/ndk/downloads/index.html
  • OpenCV下载链接:http://opencv.org/downloads.html

首先,创建一个HelloJni工程

Android Studio如何在项目中使用jni以及OpenCV库_第1张图片

写一个本地方法的类,并在MainActivity中调用

public class NativeMethod {
public static native String getStringMethod();
}

Android Studio如何在项目中使用jni以及OpenCV库_第2张图片

Android Studio如何在项目中使用jni以及OpenCV库_第3张图片

然后,需要在MainActivity中用代码加载Library

static {
System.loadLibrary(“hellojni”);
}

Android Studio如何在项目中使用jni以及OpenCV库_第4张图片

接下来,在app\build.gradle中设置库文件名(生成的so文件名)。找到gradle文件的defaultConfig这项,在里面添加如下内容:

ndk {
moduleName “hellojni” //生成的so名字
}

Android Studio如何在项目中使用jni以及OpenCV库_第5张图片

接下来这个步骤很重要,如果没有这一步的话,后面工程在编译时会出错,在app\build.gradle中找到android这项,添加如下内容:

sourceSets.main.jni.srcDirs = []

Android Studio如何在项目中使用jni以及OpenCV库_第6张图片

然后,在工程中的local.properties文件中添加NDK路径(上面下载好的那个NDK),类似其中的SDK路径一样,我的添加后如下:

ndk.dir=E:\ndk-r10\ndk-r10e-64

这里写图片描述

接下来是非常重要的步骤,我们需要配置NDK-Tools,步骤为:File->Settings->Tools->External Tools

点击”+”号,添加NDK Build

Name: NDK Build
Group: NDK
Description: NDK Build
Options: 全打勾
Show in: 全打勾
Tools Settings:
Program: Ndk安装目录/ndk-build.cmd
Parameters:NDK_PROJECT_PATH=$ModuleFileDir$/build/intermediates/ndk NDK_LIBS_OUT=$ModuleFileDir$/src/main/jniLibs NDK_APPLICATION_MK=$ModuleFileDir$/src/main/jni/Application.mk APP_BUILD_SCRIPT=$ModuleFileDir$/src/main/jni/Android.mk V=1
Working directory: $SourcepathEntry$

Android Studio如何在项目中使用jni以及OpenCV库_第7张图片

再次点击”+”号,添加Javah

Name: Javah
Group: NDK
Description: Javah
Options: 全打勾
Show in: 全打勾
Tools Settings:
Program: Java JDK安装目录/bin/javah.exe
Parameters: -v -jni -d $ModuleFileDir$/src/main/jni $FileClass$
Working directory: $SourcepathEntry$

Android Studio如何在项目中使用jni以及OpenCV库_第8张图片

配置好以后,接下来在之前写好的NativeMethod.java代码中,点击右键->NDK->Javah,这个步骤会将NativeMethod.java中的本地方法编译成jni文件夹中的.h头文件

这里写图片描述

接下来,需要在生成jni文件夹中新建Android.mk,Application.mk文件

Android.mk文件中写入以下代码:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hellojni
LOCAL_SRC_FILES := getString.c
include $(BUILD_SHARED_LIBRARY)

Application.mk文件中写入以下代码:

APP_ABI := armeabi armeabi-v7a mips x86

接下来就需要将.h头文件中的方法实现,具体步骤:复制.h头文件->粘贴到jni文件夹中->重命名为:getString.c->将方法改成以下代码:

JNIEXPORT jstring JNICALL Java_com_kevin_main_hellojni_NativeMethod_getStringMethod
(JNIEnv env, jobject obj){*
return (*env)->NewStringUTF(env,”Hello jni”);
}

接下来将jni编译成so库,具体步骤为:选中app文件夹->点击右键->NDK->NDK Build,等待编译完成后,就可以在JniLibs文件夹中看到so库了

Android Studio如何在项目中使用jni以及OpenCV库_第9张图片

接下来就可以编译运行了

Android Studio如何在项目中使用jni以及OpenCV库_第10张图片

至此,我们的工程中已经可以简单的使用jni了,但是有的项目中可能会用到其他的功能,比如我的项目中用到了OpenCV库做人脸识别的功能,这个时候就还需要我们继续做一些操作

首先,我们需要导入OpenCV库作为第三方类库使用,具体步骤为:File->New->Import Module->Source directory(选择之前下载的OpenCV4Android库的安装目录\sdk\java)->Next->Finish

此时,OpenCV库已经在我们的工程中了,但是我们的项目并没有和这个OpenCV库做关联,接下来就让我们关联OpenCV库,具体步骤为:File->Project Structure->app->Dependencies->点击”+”号->Module dependency->choose openCVLibrary->OK。如果我们成功的关联了openCV库,可以在app\build gradle文件中看到以下信息:

Android Studio如何在项目中使用jni以及OpenCV库_第11张图片

接下来,大家就可以去使用OpenCV库了,但是我之前使用的时候,遇到一个问题,虽然我可以导入OpenCV的包,使用OpenCV的数据结构,但是编译的时候总会报错,所以后来,我将OpenCV库又加载了一次就没有问题了,如果有人遇到同样的问题,可以参考一下

static {
System.loadLibrary(“hellojni”);
System.loadLibrary(“opencv_java”);
}


本人第一次写个人博客,只为给自己总结一些编程经验,并与大家分享,请多指教。

你可能感兴趣的:(android进阶篇)