Android JNI初试之环境搭建,最新方式的HelloWorld
前言
最近有个图片识别的需求.需要使用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相关推荐
- Android jni开发--NDK环境搭建
谷歌改良了ndk的开发流程,对于Windows环境下NDK的开发,如果使用的NDK是r7之前的版本,必须要安装Cygwin才能使用NDK.而在NDKr7开始,Google的Windows版的NDK提供 ...
- Android开发学习总结(一)——搭建最新版本的Android开发环境
最近由于工作中要负责开发一款Android的App,之前都是做JavaWeb的开发,Android开发虽然有所了解,但是一直没有搭建开发环 境去学习,Android的更新速度比较快了,Android1 ...
- JNI开发笔记(一)--Android Studio安装与环境搭建
Android Studio安装与环境搭建 1. 前言 1.1 什么是JNI 1.2 JNI从零开发流程 2. Java环境配置 3. Android Studio安装 参考链接 1. 前言 工作中需 ...
- Android下NDK开发环境搭建
Android下NDK开发环境搭建 1. AndroidNDK安装与配置 1.1 NDK简介 Android NDK是一套允许开发人员使用本地代码(如C/C++)进行Android APP部 ...
- 【安卓开发系列 -- 开发环境】Unbuntu 下 Android 持续集成打包环境搭建 -- Jenkins 构建工具安装(gradle + git + android 工具)
[安卓开发系列 -- 开发环境]Unbuntu 下 Android 持续集成打包环境搭建 -- Jenkins 构建工具安装(gradle + git + android 工具) [1]Unbuntu ...
- RockChip Android平台抓取android trace的windows环境搭建
RockChip Android平台抓取android trace的windows环境搭建的步骤 安装python2.7.9 下载链接: https://www.python.org/download ...
- Android源码编译环境搭建教程 (一) - Ubuntu系统构建
Android源码编译环境搭建教程 (一) - Ubuntu系统构建 本教程为感兴趣的同学提供Android源码编译的环境搭建,当然这里都是基于windows系统,mac系统也差不多,将相应的软件替换 ...
- Android电视应用开发环境搭建
Android电视应用开发环境搭建 虽然一直在做Android应用,但是一直没有涉及电视应用的开发.最近家里买了一台小米电视,条件成熟,于是开始尝试. Android Studio与电视的连接调试 像 ...
- ETH 开发环境搭建及智能合约 helloworld
ETH 开发环境搭建及智能合约 helloworld 自己的菜鸟级的起步教程,给自己长记性 准备 什么是以太坊 以太坊白皮书 以太坊白皮书_ZH 以太坊白皮书_EN 环境介绍 这里使用了,以下两个开发 ...
最新文章
- 数据库--循环语句:loop exit when/ end loop
- 【CSDN】Markdown 如何画分界线
- 深入jvm虚拟机第4版_深入理解JVM虚拟机
- R语言编程艺术(3)R语言编程基础
- js 定时网页点击_反爬 JS 逆向,扣代码解密分析
- android 高帧模式,达人分享技巧 手动让安卓机支持王者荣耀高帧率
- 教你如何使用FusionInsight SqoopShell
- 中国计算机学会 (China Computer Federation,CCF) 推荐中文科技期刊目录 - 2019
- M3U8视频下载为mp4
- 阿里图标css的使用中的使用方法,iconfont阿里巴巴矢量图标库的正确使用方法
- android切换输入法工具类
- H3c服务器升级硬盘固件,H3C交换机升级固件版本
- python实用案例教程第四章-python 入门到实践第四章案例
- 如何利用ArcScene制作简单的三维模型
- MAC 谷歌浏览器提示您的连接不是私密连接,没有继续访问选项
- 哔哩哔哩2021校招末班车来了!
- CAN矩阵(入门篇)(史上最全)
- node版本、npm版本随意切换
- 机器学习入门(二) 准备工作
- mxnet dropout 层阅读和测试
热门文章
- 《Engineering》评选2021年全球十大工程成就 | 中国工程院院刊
- 一文读懂全球半导体市场
- 新型支架状电极允许人类思想操作计算机
- 强化学习到底是什么,它如何运作?
- 图解未来50年前沿科技趋势与22个预测
- 阿里120页PPT诠释国家“智能+”战略
- 2019年25大人工智能趋势!一文看到未来
- “间谍芯片”疑云:谁在撒谎?警示何在?
- 7个小技巧,老板再也无法留我加班了...
- “计算机艺术之父”、现代计算机技术先驱查理斯·苏黎去世,享年99岁!