博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android JNI初试之环境搭建,最新方式的HelloWorld
阅读量:7197 次
发布时间:2019-06-29

本文共 2683 字,大约阅读时间需要 8 分钟。

前言

最近有个图片识别的需求.需要使用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.mkapplication.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 := onOpenCV_CAMERA_MODULES := off#opencv编译成静态库OPENCV_LIB_TYPE :=STATIC#设定OpenCV.mk文件的地址ifeq ("$(wildcard $(OPENCV_MK_PATH))","")include ../native/jni/OpenCV.mk#注意这里要根据自己的native地址修改elseinclude $(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_staticAPP_CPPFLAGS := -frtti -fexceptions -std=c++11 -O3 #C++编译器flagAPP_OPTIM := release #设定编译动态库的版本 debug或者release复制代码

环境配置完了,怎么写?

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

alt+enter提示.

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

修改cpp

调用运行

结果:
生成so文件在这里

结语:

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


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

转载地址:http://smzum.baihongyu.com/

你可能感兴趣的文章
Thymeleaf教程 (十) 属性的优先级列表
查看>>
linux中 vi / vim显示行号或取消行号命令
查看>>
Python学习笔记 - 02: 用Python Client连接ElasticSearch操作数据
查看>>
2018年前端开发回顾
查看>>
微信小程序访问webService(Java)
查看>>
QT从QObject实现多重继承
查看>>
DelayQueue实现Java延时任务
查看>>
PHP 依赖注入,依赖反转 (IOC-DI)
查看>>
Android代码混淆,为移动应用提供更安全的保护
查看>>
js跨域设置cookie
查看>>
确保物联网安全的关键技术盘点
查看>>
防止域名证书劫持,阿里云解析率先支持CAA
查看>>
089-挂载iso镜像时,怎么重启依旧挂载
查看>>
sqlmap常用注入点检测&爆破命令
查看>>
阿里云移动数据分析服务功能与应用场景
查看>>
Node----异步编程
查看>>
Ubuntu16.04下安装配置xammp
查看>>
Hystrix的配置属性优先级和详解
查看>>
Activiti和Spring集成
查看>>
springmvc+spring+mybatis整合
查看>>