前言

最近有个图片识别的需求.需要使用OpenCV,于是研究起了JNI,发现很多资料过旧.绕了大圈.踩了几个坑.总结一下.

什么是JNI

Java Native Interface , 实现Java和其他语言的通信. 就是支持java与其他语言交互的,一般都是C/C++

Android studio配置

1.必须要下的两个东西:

打开SDKTools.

如图,下载CMake,NDK

2.要修改的配置文件

项目根目录 gradle.properties中添加

android.useDeprecatedNdk=true
复制代码

local.properties中添加

ndk.dir=你的NDK路径名
//我的是ndk.dir=E\:\\sdk\\ndk-bundle
复制代码

正题,如何实现JNI

1.java层怎么写接口.

创建一个java类.

package demo.hello;public class HelloWorld {
//使用这种方法加载so库,如果你经常看framwork层的源码,就会发现很多这样的代码
static {//这个是打包好的so库,可以先不管.System.loadLibrary("HelloWorld");}//这是一个接口,通过这个接口与jni交互public native String getString();
}
复制代码
2.生成h头文件(旧)

这时build一下项目,然后在

找到HelloWord.class文件. 然后通过cmd 切换路径到classes路径下. 再敲javah命令 javah -jni demo.hello.HelloWorld.class包名生成h头文件

有人要吐槽了,你这说的啥玩意.看不懂.

哈哈,为什么只说这么一点点呢..

因为这个传统的方法真的是太操D了.我被坑了半天.有新的方法

往后看

传统的方法会碰到以下几个问题:

  • java环境变量没配
  • android环境变量没配
  • 如果HelloWorld这个类中有导入其他的包,就会出现类找不到的情况. 我是Bitmap类找不到.需要把sdk目录下的 添加到环境变量里面.
或者使用命令行:

javah -classpath E:\sdk\platforms\android-26\android.jar;. -jni com.demo.HelloWorld 规则:javah -classpath 环境路径; . -HelloWordl的路径

以上这些问题都没什么,最重要的问题是,传统方法,在AS里面写C++是没有代码提示的!!!!!这还能玩????


起飞,新方式:

升级AS到2.2版本以上.最好3.0

选上!.

下一步下一步,到这个页面.可以啥不改,啥不选. 有3个,1个是选择C++版本.下面两个勾选一个是异常,一个是debug功能吧.

创建完成后是这样的.

我的AS版本是3.0,以上是自动生成的目录与文件.

最主要的是这个CMakeLists.txt 可以看看官方的文档说明

老项目怎么办?

可以使用老jni项目,以及使用MK文件来配置环境 比如我现在写的就是这样的:

放C++文件的目录叫什么其实并不重要

可以看到里面有2个文件.这是旧方式实现所需要的.我直接移植过来了.

android.mk
application.mk
复制代码

怎么让老项目支持?简单

点击你的app目录,右键.

选到自定义jni目录,然后选择Android.mk文件就行了. AS会根据里面的配置自动生成CMake文件

还可以: 在App目录下的build.gradle

android{defaultConfig {// ...ndk {abiFilters 'armeabi', 'armeabi-v7a', 'x86', 'x86_64' }}externalNativeBuild {ndkBuild {path 'src/main/jni/Android.mk'}}}
复制代码

Android.mk内容(注意只是参考,里面内容要根据提示修改,比如LOCAL_SRC_FILES,要都改成你自己写的cpp文件名)

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)OpenCV_INSTALL_MODULES := on
OpenCV_CAMERA_MODULES := off
#opencv编译成静态库
OPENCV_LIB_TYPE :=STATIC
#设定OpenCV.mk文件的地址
ifeq ("$(wildcard $(OPENCV_MK_PATH))","")
include ../native/jni/OpenCV.mk#注意这里要根据自己的native地址修改
else
include $(OPENCV_MK_PATH)
endif
#自己编译出的动态库名字
LOCAL_MODULE := so库的名字
#你要打包的C++文件名,多个文件换行用\隔开
LOCAL_SRC_FILES := a.cpp \ b.cpp \c.cpp
#要加入的C++基础库
LOCAL_LDLIBS +=  -lm -llog -ljnigraphicsinclude $(BUILD_SHARED_LIBRARY)
复制代码

Application.mk内容

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions -std=c++11 -O3 #C++编译器flag
APP_OPTIM := release #设定编译动态库的版本 debug或者release
复制代码

环境配置完了,怎么写?

在新建的项目中 我随便写一个native方法.

alt+enter提示.

打开native-lib.cpp,惊不惊喜,意不意外

修改cpp

调用运行

结果: 生成so文件在这里

结语:

以上为昨天所有心得,早上开始找资料,基本上都是老方法. 最后用老方法配置好了(真的很麻烦..各种配置) 到了下午,发现了新方法.google老大就是体贴.哈哈


您的喜欢与提问回复是我最大的动力-_- 交流群:493180098

Android JNI初试之环境搭建,最新方式的HelloWorld相关推荐

  1. Android jni开发--NDK环境搭建

    谷歌改良了ndk的开发流程,对于Windows环境下NDK的开发,如果使用的NDK是r7之前的版本,必须要安装Cygwin才能使用NDK.而在NDKr7开始,Google的Windows版的NDK提供 ...

  2. Android开发学习总结(一)——搭建最新版本的Android开发环境

    最近由于工作中要负责开发一款Android的App,之前都是做JavaWeb的开发,Android开发虽然有所了解,但是一直没有搭建开发环 境去学习,Android的更新速度比较快了,Android1 ...

  3. JNI开发笔记(一)--Android Studio安装与环境搭建

    Android Studio安装与环境搭建 1. 前言 1.1 什么是JNI 1.2 JNI从零开发流程 2. Java环境配置 3. Android Studio安装 参考链接 1. 前言 工作中需 ...

  4. Android下NDK开发环境搭建

    Android下NDK开发环境搭建 1.     AndroidNDK安装与配置 1.1  NDK简介 Android NDK是一套允许开发人员使用本地代码(如C/C++)进行Android APP部 ...

  5. 【安卓开发系列 -- 开发环境】Unbuntu 下 Android 持续集成打包环境搭建 -- Jenkins 构建工具安装(gradle + git + android 工具)

    [安卓开发系列 -- 开发环境]Unbuntu 下 Android 持续集成打包环境搭建 -- Jenkins 构建工具安装(gradle + git + android 工具) [1]Unbuntu ...

  6. RockChip Android平台抓取android trace的windows环境搭建

    RockChip Android平台抓取android trace的windows环境搭建的步骤 安装python2.7.9 下载链接: https://www.python.org/download ...

  7. Android源码编译环境搭建教程 (一) - Ubuntu系统构建

    Android源码编译环境搭建教程 (一) - Ubuntu系统构建 本教程为感兴趣的同学提供Android源码编译的环境搭建,当然这里都是基于windows系统,mac系统也差不多,将相应的软件替换 ...

  8. Android电视应用开发环境搭建

    Android电视应用开发环境搭建 虽然一直在做Android应用,但是一直没有涉及电视应用的开发.最近家里买了一台小米电视,条件成熟,于是开始尝试. Android Studio与电视的连接调试 像 ...

  9. ETH 开发环境搭建及智能合约 helloworld

    ETH 开发环境搭建及智能合约 helloworld 自己的菜鸟级的起步教程,给自己长记性 准备 什么是以太坊 以太坊白皮书 以太坊白皮书_ZH 以太坊白皮书_EN 环境介绍 这里使用了,以下两个开发 ...

最新文章

  1. 数据库--循环语句:loop exit when/ end loop
  2. 【CSDN】Markdown 如何画分界线
  3. 深入jvm虚拟机第4版_深入理解JVM虚拟机
  4. R语言编程艺术(3)R语言编程基础
  5. js 定时网页点击_反爬 JS 逆向,扣代码解密分析
  6. android 高帧模式,达人分享技巧 手动让安卓机支持王者荣耀高帧率
  7. 教你如何使用FusionInsight SqoopShell
  8. 中国计算机学会 (China Computer Federation,CCF) 推荐中文科技期刊目录 - 2019
  9. M3U8视频下载为mp4
  10. 阿里图标css的使用中的使用方法,iconfont阿里巴巴矢量图标库的正确使用方法
  11. android切换输入法工具类
  12. H3c服务器升级硬盘固件,H3C交换机升级固件版本
  13. python实用案例教程第四章-python 入门到实践第四章案例
  14. 如何利用ArcScene制作简单的三维模型
  15. MAC 谷歌浏览器提示您的连接不是私密连接,没有继续访问选项
  16. 哔哩哔哩2021校招末班车来了!
  17. CAN矩阵(入门篇)(史上最全)
  18. node版本、npm版本随意切换
  19. 机器学习入门(二) 准备工作
  20. mxnet dropout 层阅读和测试

热门文章

  1. 《Engineering》评选2021年全球十大工程成就 | 中国工程院院刊
  2. 一文读懂全球半导体市场
  3. 新型支架状电极允许人类思想操作计算机
  4. 强化学习到底是什么,它如何运作?
  5. 图解未来50年前沿科技趋势与22个预测
  6. 阿里120页PPT诠释国家“智能+”战略
  7. 2019年25大人工智能趋势!一文看到未来
  8. “间谍芯片”疑云:谁在撒谎?警示何在?
  9. 7个小技巧,老板再也无法留我加班了...
  10. “计算机艺术之父”、现代计算机技术先驱查理斯·苏黎去世,享年99岁!