Android jni 开发详细流程

Android jni 开发流程

  • 文档简介
  • 开发目的
  • 开发步骤
    • (一)新建一个android工程
    • (二)新建Java包
    • (三)生成native方法
    • (四)native方法声明
    • (五)native方法实现
    • (六)Android.mk文件配置
      • (1) App/build.gradel中的externalNativeBuild下一单元添加
      • (2)在jni层中添加Android.mk文件
      • (3)在jni层中添加Application.mk文件
      • (4)在native方法下添加CyAlgo/Android.mk文件
    • (七)Ndk编译.so库
  • Native方法调用

文档简介

该文档主要简介Android jni的开发流程。 Android jni开发主要依赖Android开发平台,sdk和ndk三个部分。
Android: C:\Users\CyAlgo_Install\Android-install
Sdk: C:\Users\CyAlgo_Install\Android\Sdk
Ndk: C:\Users\CyAlgo_Install\android-ndk-r17b。

开发目的

在Android studio上编译c/c++ jni 并自动生成so库,在java类中引用。

开发步骤

(一)新建一个android工程

新建一个android工程,注意勾选Include C++ support,后面的直接下一步,最后可以勾选Exceptions Support.
Android jni 开发详细流程_第1张图片

(二)新建Java包

在project下的app/src/main/java/下新建package命名为myPackage,在该包中新建Java Class,命名为my_native.并在my_native文件中创建自己的方法。

Android jni 开发详细流程_第2张图片

(三)生成native方法

首先配置编译工具来编译或在terminal通过命令行完成编译。Android jni 开发详细流程_第3张图片
terminal命令行:javah -d jni -jni -classpath class
如下:
先cd到D:\AndroidStudio\MyApplication\app\src\main目录下,然后输入下面三行命令:
javah -d jni -jni -classpath D:\AndroidStudio\MyApplication\app\build\intermediates\classes\debug
myPackage.my_native

注意:如果找不到build\intermediates\classes\debug路径时,先crtl+F9或者build->make project来生成该文件。

(四)native方法声明

Jni方法声明和实现。步骤三成功编译后在jni下生成如下.h的头文件。复制该头文件然后改后缀为.cpp。

Android jni 开发详细流程_第4张图片
移动这两个文件到指定的文件夹下,文件夹下包含c/c++实现源码,如下图CyAlgo_Engine文件夹下的子文件夹imp下的c/c++文件。注意在.cpp文档中需要包含.h头文件和c/c++的头文件。
Android jni 开发详细流程_第5张图片

(五)native方法实现

在jni中封装c/c++实现。在.cpp文件中封装c/c++函数,注意变量类型转变。charmodelNameBuff = (char)env-> GetStringUTFChars ( ImgName, NULL);

(六)Android.mk文件配置

(1) App/build.gradel中的externalNativeBuild下一单元添加

ndk {
moduleName “CyAlgo_DigitalRecog”
moduleName “CyAlgo_PointerInstRecog”
moduleName “CyAlgo_GXrecog”
ldLibs “log”,“jnigraphics” // 引入库,比如要用到的__android_log_print
abiFilters “armeabi-v7a”,“x86” // “x86” 显示指定支持的ABIs
stl “stlport_static”
}
sourceSets {
main {
jniLibs.srcDir ‘src/main/libs’ // jni库目录
jni.srcDirs = [] // jni代码目录
}
}
或者之间替换该文件内容。

(2)在jni层中添加Android.mk文件

LOCAL_PATH := $(call my-dir)
MY_PATH := $(call my-dir)
#include $(MY_PATH)/CyAlgo_CreateModel/Android.mk
#include $(MY_PATH)/CyAlgo_GXrecog/Android.mk
#include $(MY_PATH)/CyAlgo_PointerInstRecog/Android.mk
include $(MY_PATH)/CyAlgo_Engine/Android.mk //需要编译的工程

(3)在jni层中添加Application.mk文件

APP_ABI := armeabi-v7a x86
APP_CPPFLAGS := -fexceptions -frtti
APP_STL := gnustl_static
APP_PLATFORM := android-21

(4)在native方法下添加CyAlgo/Android.mk文件

LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
OPENCV_LIB_TYPE :=STATIC
LOCAL_MODULE :=CyAlgo_Engine
LOCAL_SRC_FILES := yaoyu_example_home_myapplication_CyAlgo_Engine.cpp
imp/engine.cpp
LOCAL_LDLIBS := -llog -ljnigraphics -lz
include $(BUILD_SHARED_LIBRARY)

(七)Ndk编译.so库

打开dos窗口cd到C:\YaoYu_Study\AndroidStudio\MyApplication\app\src\main下输入ndk-build回车开始编译。这里需要提前配置好android-ndk的环境变量。C:\YaoYu_Study>cd C:\YaoYu_Study\AndroidStudio\CyAlgoA\app\src\main ->Ndk-buildAndroid jni 开发详细流程_第6张图片

Native方法调用

在MainActivity文档中首先导入库,记得去头lib和去尾.soAndroid jni 开发详细流程_第7张图片

你可能感兴趣的:(学习笔记)