android6.0的系统为什么在androidstudio中运行不了~
目前OpenCV在Android6.0遇到两个问题:(我用的是OpenCV2.4.9)
1、直接无法运行
2、找不到OpenCV Manager
第一个通常错误在于,出现三行可以追溯的OpenCV代码位置,点击第一个类AsyncServiceHelper
找到方法 initOpenCV
改为:
[java] view plain copy
public static boolean initOpenCV(String Version, final Context AppContext,
final LoaderCallbackInterface Callback)
{
AsyncServiceHelper helper = new AsyncServiceHelper(Version, AppContext, Callback);
Intent intent = new Intent("org.opencv.engine.BIND");
intent.setPackage("org.opencv.engine");
if (AppContext.bindService(intent, helper.mServiceConnection, Context.BIND_AUTO_CREATE)) {
return true;
}
// if (AppContext.bindService(new Intent("org.opencv.engine.BIND"),
// helper.mServiceConnection, Context.BIND_AUTO_CREATE))
// {
// return true;
// }
else {
AppContext.unbindService(helper.mServiceConnection);
InstallService(AppContext, Callback);
return false;
}
}
即可(注释部分为源代码),然后就可以运行了。
问题2
测试在Android5.0.1可以正常运行,而在Android5.1.1和Android6.0都无法运行(找不到Android Manager,让你下载,然而下载后没用,还在寻找解决方案中,有知道的小伙伴告诉我一声哈)
1、Google推出的
毫无疑问,这个是它的最大优势,Android Stuido是Google推出,专门为Android“量身订做”的,是Google大力支持的一款基于IntelliJ idea改造的IDE,google的工程师团队肯定会不断完善,上升空间非常大,这个应该能说明为什么它是Android的未来
2、速度更快
Eclipse的启动速度、响应速度、内存占用一直被诟病,相信大家这点应该深有体会,而且经常遇到卡死状态。Studio不管哪一个方面都全面领先Eclipse。这点可能在windows上没有表现出来,win上运行studio同样会出现卡顿现象,但这只能说win平台还没优化好,毕竟还没有发布正式版,或者说windows系统本身就很卡顿,你还能指望它做什么呢。
3、UI更漂亮
I/O上演示的那款黑色主题真是太棒了,极客范,Stuido自带的Darcula主题的炫酷黑界面实在是高大上,相比而言Eclipse下的黑色主题太low了
4、更加智能
提示补全对于开发来说意义重大, Studio则更加智能,智能保存,从此再也不用每次都 Ctrl + S了。熟悉Studio以后效率会大大提升。
5、整合了Gradle构建工具
Gradle是一个新的构建工具,自Studio亮相之处就支持Gradle,可以说Gradle集合了Ant和Maven的优点,不管是配置、编译、打包都非常棒。
6、强大的UI编辑器
Android Studio的编辑器非常的智能,除了吸收Eclipse+ADT的优点之外,还自带了多设备的实时预览,相对这对Android开发者来说简直是神器啊。
7、内置终端
Studio内置终端,这对于习惯命令行操作的人来说简直是福音啊,再也不用来回切换了,一个Studio全部搞定。
8、更完善的插件系统
Studio下支持各种插件,如Git、Markdown、Gradle等等,你想要什么插件,直接搜索下载。
9、完美整合版本控制系统
安装的时候就自带了如GitHub, Git, SVN等流行的版本控制系统,可以直接check out你的项目。
1,过程感慨(想直接看教程,请跳过此部分)
在写具体内容之前,我先说下我搞这个东西的过程,由于导师之前说过要搞个图像匹配的androi APP,具体就是匹配前后两张图片的相似度,类似 安卓5/project/opencvlibrary/opencv-android/3%2F&ts=1436167636&use_mirror=nchc
编译/asmcvc/article/details/9311573,我上面说了,不一定要用它,win 自带的 cmd 也可以编译。如果使用 cygwin,要做好心理准备,下载和安装它,非常非常的久,文件总体积 20 多G!!!!我是用了9个多小时。
3,---opencv for android 的sdk 下载完成后。打开 该文件夹,sdk/native/libs,里面有很多平台的文件夹,能在里面出现的,证明你能够在下面的 Application.mk 中设置生成对应的架构的 .so文件,我举个例子,我的是:
在下面介绍的 Application.mk 文件中有一句话 ,它是用来设置生成 对应架构的 .so 文件,我这里是armeabi-7a,如果要生所有的,写出 :=all,注意,这样很可能会报错,错误信息是,某种架构找不到,所以,我要你看清楚,上面文件夹里面有哪些架构,这些 坑是网上找不到,如果你要生成两种,可以轮着来编译,第二次的编译,不同的架构是不会覆盖的。现在打开 sdk/native/jni,如无意外,里面肯定有个 文件叫做 OpenCV.mk,它就是我们在 android.mk 脚本文件中要引入 opencv C++库所要参照的文件。请用记事本 或者Notepad++ 打开。
4,---了解 Android.mk 和 Application.mk 文件的基本内容信息:下面我使用默认的 Android.mk 来说明,和我的例子的 Application.mk 来说明。
它们都是脚本文件。
Android.mk
Application.mk
4,编译 .so
使用你的 as 创建一个新项目,然后在你的 项目的 main 目录下创建一个一个 jni 文件夹,这样创建:
创建好了之后,是这样的:
首先编译 项目的头文件 .h,一般编译出来后,它的名字结构是:包名_类名.h
编译命令如下,请在你的 as 下面的 Terminal 里面输入:
SourcePath: D:\work\androidstudio\VisualRecognition\app\src\main\java (绝对路径)
TargetPath: D:\work\androidstudio\VisualRecognition\visual\src\main\jni (绝对路径)
TargetClassName: com.yf.visualrecognition.UnityPlayerActivity (你的包名+类名)
格式: javah -d ${SourceFile} -classpath ${TargetPath} ${TargetClassName}
控制台指令:javah -d D:\work\androidstudio\VisualRecognition\visual\src\main\jni -classpath D:\work\androidstudio\VisualRecognition\app\src\main\java io.github.froger.jni.MyActivity
然后在你的jni 文件夹下面 分别创建 Android.mk 、Application.mk 和你要编译的 .cpp 或者.c 文件,前两个的 内容可以模仿我上面介绍的, .cpp 我这里提供一个。
Android.mk 、Application.mk 、ImgFuncpp 分别如下,util.c 是空文件,之所以创建它是为了避免另外一个 bug,这不说:
Android.mk 文件如下
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)OPENCV_LIB_TYPE:=STATICifeq ("$(wildcard $(OPENCV_MK_PATH))","")include E:\OpenCV-3.0.0-android-sdk-1\OpenCV-android-sdk\sdk\native\jni\OpenCV.mkelseinclude $(OPENCV_MK_PATH)endifLOCAL_MODULE := ImgFunLOCAL_SRC_FILES := ImgFun.cppLOCAL_LDLIBS += -lm -lloginclude $(BUILD_SHARED_LIBRARY)
Application.mk 文件如下
APP_STL := gnustl_staticAPP_CPPFLAGS := -frtti -fexceptionsAPP_ABI := armeabi-v7a #这句是设置生成的cpu指令类型,提示,目前绝大部分安卓手机支持armeabi,libs下太多类型,编译进去 apk 包会过大APP_PLATFORM := android-8 #这句是设置最低安卓平台,可以不弄
ImgFun.cpp 文件如下
1 #include <io_github_froger_jni_MyActivity.h> 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <opencv2/opencv.hpp> 5usingnamespace cv; 6 IplImage * change4channelTo3InIplImage(IplImage * src); 7 8extern"C" { 9JNIEXPORT jintArray JNICALL Java_io_github_froger_jni_MyActivity_ImgFun(10 JNIEnv* env, jobject obj, jintArray buf, int w, int h);11JNIEXPORT jintArray JNICALL Java_io_github_froger_jni_MyActivity_ImgFun(12 JNIEnv* env, jobject obj, jintArray buf, int w, int h) {1314 jint *cbuf;15 cbuf = env->GetIntArrayElements(buf, false);16if (cbuf == NULL) {17return0;18 }1920 Mat myimg(h, w, CV_8UC4, (unsigned char*) cbuf);21 IplImage image=IplImage(myimg);22 IplImage* image3channel = change4channelTo3InIplImage(&image);2324 IplImage* pCannyImage=cvCreateImage(cvGetSize(image3channel),IPL_DEPTH_8U,1);2526 cvCanny(image3channel,pCannyImage,50,150,3);2728int* outImage=newint[w*h];29for(int i=0;i<w*h;i++)30 {31 outImage[i]=(int)pCannyImage->imageData[i];32 }3334int size = w * h;35 jintArray result = env->NewIntArray(size);36 env->SetIntArrayRegion(result, 0, size, outImage);37 env->ReleaseIntArrayElements(buf, cbuf, 0);38return result;39}40}4142 IplImage * change4channelTo3InIplImage(IplImage * src) {43if (src->nChannels != 4) {44return NULL;45 }4647 IplImage * destImg = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 3);48for (int row = 0; row < src->height; row++) {49for (int col = 0; col < src->width; col++) {50 CvScalar s = cvGet2D(src, row, col);51 cvSet2D(destImg, row, col, s);52 }53 }5455return destImg;56 }
上面 .cpp 文件的有几句话要说明下,注意 .c 文件和 .cpp 文件是不一样的:
1,请用 extern "C" { } 包住 你要你的 c++ 函数体的定义和里面的变量,函数声明可以在外面。
2,JNIEXPORT jintArray JNICALL Java_io_github_froger_jni_MyActivity_ImgFun(JNIEnv* env, jobject obj, jintArray buf, int w, int h);
3,jintArray 是你定义的函数的返回值,我这里的是int数组,它在类型的前面有一个 j ,如果是字符串,那么就是 jstring,数组加上Array;
4,JNICALL Java 这句不变,所有都一样,注意java的 j 是大写;
5,io_github_froger_jni 这里是你的包名;
6,MyActivity 你的类名,要引用这个这里C++函数的类名;
7,ImgFun 是你要在java中调用的函数名字,哪些不用直接被调用的,不用写;
8,JNIEnv* env, jobject obj, 这个固定不变,第一个的意思是虚拟机引用,第二个是项目;
9,jintArray buf, int w, int h 函数的参数。
好了,上面该介绍的已经介绍完了,接下来是编译 .so 的正式操作(我这里使用cmd做例子,因为它更简单操作,cygwin也可以)。
你可以在 as 的 cmd 中或者 系统的 cmd框中实现编译,首先使用命令进入到当前的 jni 文件夹的 目录,例如,我的是
D:asproject/JniDemo/app/main/jni,然后使用命令 ndk-build,(使用ndk-build命令这一步,需要你已经配置好了 ndk 环境,请参照百度上面的教程)然后回车,如无意外,将会生成如下文件:
其中的 .so 文件就是我们所需要的,现在打开你项目app下的 build.gradle 文件,在 android{} 里面加入:
sourceSets { main() { jniLibs.srcDirs = ['src/main/libs'] }}
这样是为了使用 .so文件,上面我们仅仅是生产!
OK,到这里基本大功告成了,不过,笔者我就是在这一步之后,运行程序的时候,出现的简单的致命的 bug,导致我找了近2星期,现在想起来真是蠢..............
5,遇到的关键问题及其解决方法
运行程序,出现,如下错误,这里声明下,不仅仅是 opencv2/opencv.hpp,还可能是其他的 hpp。
出现的原因:
原来是这样的,android studio 在我们编译完 .so 文件后,我们在Android.mk 文件中设置引入的opencv 函数库,是已经被编译进去.so 动态库里面了的,而我们编译所需要的 cpp 文件,它在 jni 文件夹呢,自然就没有 opencv 库可依赖,所以。
解决方法:
在你编译完.so 文件后,就可以把 cpp 或者 c 文件里面的内容 注释或者删除了,不然在你运行程序的时候就会抛出头文件找不到的错误,哎,真是辛酸泪,这样一个 bug 搞了我 那么多时间,不过还好,还是解决了。
6,实现效果截图。
1package io.github.froger.jni; 2 3import android.app.Activity; 4import android.graphics.Bitmap; 5import android.graphics.drawable.BitmapDrawable; 6import android.os.Bundle; 7import android.view.View; 8import android.widget.Button; 9import android.widget.ImageView;1011publicclass MyActivity extends Activity {12/** Called when the activity is first created. */13 ImageView imgView;14 Button btnNDK, btnRestore;15publicstaticnativeint[] ImgFun(int[] buf, int w, int h);16static {17 System.loadLibrary("ImgFun");18 }19 @Override20publicvoid onCreate(Bundle savedInstanceState) {21super.onCreate(savedInstanceState);22 setContentView(R.layout.activity_my);2324this.setTitle("使用NDK转换灰度图");25 btnRestore = (Button) this.findViewById(R.id.btnRestore);26//btnRestore.setText(ImgFun());27 btnRestore.setOnClickListener(new ClickEvent());28 btnNDK = (Button) this.findViewById(R.id.btnNDK);29 btnNDK.setOnClickListener(new ClickEvent());30 imgView = (ImageView) this.findViewById(R.id.ImageView01);31 Bitmap img = ((BitmapDrawable) getResources().getDrawable(32 R.drawable.ic_launcher)).getBitmap();33 imgView.setImageBitmap(img);34 }3536class ClickEvent implements View.OnClickListener {37publicvoid onClick(View v) {38//btnRestore.setText(ImgFun());39if (v == btnNDK) {40long current = System.currentTimeMillis();41 Bitmap img1 = ((BitmapDrawable) getResources().getDrawable(42 R.drawable.ic_launcher)).getBitmap();43int w = img1.getWidth(), h = img1.getHeight();44int[] pix = newint[w * h];45 img1.getPixels(pix, 0, w, 0, 0, w, h);46int[] resultInt = ImgFun(pix, w, h);47 Bitmap resultImg = Bitmap.createBitmap(w, h, Bitmap.Config.RGB_565);48 resultImg.setPixels(resultInt, 0, w, 0, 0, w, h);49long performance = System.currentTimeMillis() - current;50 imgView.setImageBitmap(resultImg);51 } elseif (v == btnRestore) {52 Bitmap img2 = ((BitmapDrawable) getResources().getDrawable(53 R.drawable.ic_launcher)).getBitmap();54 imgView.setImageBitmap(img2);55 }56 }57 }585960 }
android studio是什么?
Android Studio 是谷歌推出的一个Android集成开发工具,基于IntelliJ IDEA。Android Studio 提供的功能:1、基于Gradle的构建支持。2、Android 专属的重构和快速修复。3、提示工具以捕获性能、可用性、版本兼容性等问题。4、支持ProGuard 和应用签名。5、基于模板的向导来生成常用的 Android 应用设计和组件。6...
Android Studio怎么导入新的项目?
1、打开自己的IDE-AndroidStudio,如图:2、点击“File”的按钮,然后选择“Import Project”,如图:3、找到你要导入的程序,最好选择build.gradle文件,如图:4、选择“Next”如图:5、选择“Next”如图:6、等待导入过程,如图:7、最后导入成功,可以查看一下,如图:
androidstudio安装教程
1. 首先,从官方网站下载 Android Studio 的安装程序。搜索 "Android Studio 下载",找到官方网站下载页面,选择适合你操作系统的版本,然后点击下载按钮。2. 下载完成后,双击运行安装程序。根据操作系统的不同,可能会出现一些提醒或确认窗口,按照提示进行操作即可。3. 在安装向导中,选择是否安装 Android...
Android Studio导入library项目开源库的图文教程
一、在AndroidStudio中导入Library项目 1、启动AndroidStudio后,打开你需要接收Library的项目。比如有两个项目,项目A,和Library项目B,那么打开项目A。图中所示为项目的结构图,点击右上角的File菜单。2、在下拉菜单中依次找到New Import Module,点击打开项目导入窗口。注意导入的是Module而不是Project,如...
android studio生成apk在哪?
1、打开AndroidStudio,并且打开想要生成apk文件的项目。点击工具栏上面的“Builder”,点击“Builder”之后在下拉菜单里面可以看到“Genarate Singed APK”,点击这个选项。2、之后会要求开发者输入相关的密钥文件和密码。3、申请一个新的密钥文件,点击上一个图片中“Create new...”即可打开新建密钥文件的...
开发安卓app(从入门到精通)
安卓虚拟机是用来模拟安卓设备的软件,可以在AndroidStudio中下载并安装。二、创建第一个安卓app 1.创建新项目 打开AndroidStudio,点击“StartanewAndroidStudioproject”创建一个新的安卓项目。在“CreateNewProject”对话框中,填写项目名称、包名、项目路径等信息。2.选择模板 在“AddanactivitytoMobile”...
android studio怎么打开一个已存在的工程
1、下载了GitHub上面的一个路由分发的项目?2、然后我在AndroidStudio里面新建了一个可运行的项目:Test 3、app\/build.gradle配置如下(新建自动生成的,没做任何改动):4、project\/build.gradle配置如下(自动生成,未做任何改动)5、这个时候解压下载的qiaoba.zip 6、打开qiaoba项目的app\/build.gradle,...
android studio工程的默认放在哪里
android studio工程的默认放在 C:\\Users\\Administrator\\AndroidstudioProjects。其中Administrator上填自己电脑的用户名 修改方法很简单,在下次创建新的项目时,选择其他路径即可
Android studio怎样更改版本号?
1、首先打开Androidstudio软件。2、在文件里找到app--》build.gradle文件,点击打开此文件。3、可以看到这里的 versionName(版本号)为"1.0" versionCode为“1”。4、改成需要的版本号,这里改为1.0.1(versionCode的值不改也没影响,但是建议改一下)。5、查看是否与想要改的版本号一致。6、最后...
android Studio调试出现USB device not found怎么办?
androidStudio关于USB device not found的解决办法,我们使用Android Studio进行Android开发时,当我们使用真机进行调试时,很可能会出现USB device not found的问题。网上提出了很多决解办法,很多都是错误的。现给出正确的解决方法 1、首先检查一下你的SDK 是否安装了,如果没有安装SDK,请先安装!如果安装...
高陵县13577414599:
为什么androidstudio里的数据库不能更新 - ?
冻钓欣泰: Android Studio 是可以在线增量更新的,但是可能连不上服务器更新,解决办法如下:1.修改系统hosts文件,添加如下2行203.208.46.146 dl-ssl.google.com203.208.46.146 dl.google.com2.修改Android Studio\bin目录下的studio.vmoptions (32位系...
高陵县13577414599:
为什么搜狗输入法,在androidStudio上无法输入中文 - ?
冻钓欣泰: 如果安装了搜狗输入法在wps等第三方软件上无法切换到搜狗输入法,输入中文的,应该是,ibus框架有冲突了,所以使用如下命令删除ibus,重启即可.
高陵县13577414599:
androidstudio为什么debug不了 - ?
冻钓欣泰: Debug模式启动1启动Android Studio打开一个demo程序,2点击工具栏的调试按钮或者点击菜单“Run”-“Debug...”,3在”Choose Device“对话框中,选择设备,4设置好断点,然后让应用程序断下来.
高陵县13577414599:
为啥androidstudio 出现 no debuggable application - ?
冻钓欣泰: AndroidStudio中 Tools->Android->Enable ADB Integration active.之后需等待一会,可能adb会重启,之后就会发现那个框框正常显示你已启动的app
高陵县13577414599:
为什么吗androidstudio每打开一个window都要重新配置 - ?
冻钓欣泰: 这个是有关于Android项目的编译问题,其中在项目初始化的时候gradle已经走了一遍了.gradle最大的作用是Build System.每次打开的时候都会对现有项目进行配置,包括脚本的运行环境,支持java项目依赖库的管理和依赖包的定义,声明构建项目的类型和设置编译android项目的参数.包括签名和打包也在gradle中可以非常简单的使用.每个项目都是独立和唯一的,所以每次打开窗口之后都会读取缓存,如果有缓存的话可以快速打开,第一次需要去下载缓存.所以会很慢.
高陵县13577414599:
Android Studio 为什么老是加载不起.so文件? - ?
冻钓欣泰: Android Studio刚发布,相信很多朋友和我一样,开始尝试用其开发项目,但新东西总会遇到这样或那样的问题,其中令我头的就是引入第三方的jar包无法编译的问题,因为是新东西,相关的信息都比较少,解决问题令我花费了相当长的时间,...
高陵县13577414599:
为什么android studio在配置测试时没有android tests - ?
冻钓欣泰: AndroidStudio项目发布到GitHub1.在AndroidStudio中新建一个项目(这个不能不知道吧!)2.设置: Settings->VersionControl->Git,设置git目录,点击Test测试,如果成功会有Success提示3.设置:Settring->VersionControl-> GitHub,设置自...
高陵县13577414599:
Android Studio提示错误,但程序却可以运行,啥情况? - ?
冻钓欣泰: 点击AndroidStudio菜单File -> Invalidate Caches/Restart… ,在弹出的对话框中点击Invalidate and Restart,等重新打开可能就没问题了吧
高陵县13577414599:
第一次安装的Androidstudio3.0,为什么工具栏上的图标显灰色 - ?
冻钓欣泰: 换个版本安装看看 点击下载 Android studio 安装篇:ps:在安装Android Studio之前需要先安装需要先安装好JDK文件(根据电脑系统版本选择正确的JDK)1、运行下载完成的安装包2、我们提供的版本已经包含了SDK的安装文件,所以直接全...