鼓捣了两三天,终于成功算跑通了一个简单的程序。下面说说具体的安装:

因为从同学那里拷过来的eclipse 就有adt cdt 的插件。所以这两个就不用再安装了。(需要的话自己安装)

具体说下安装过程:把从官网下载下来的“android-ndk-r10c-windows-x86_64.exe”放到“D:\“目录下面,然后双击安装,便会自动解压到"D:\" 。这里放到哪里解压到哪里都无所谓(之后还要转移),解压以后是一个文件夹,然后把这个文件夹最好放到和android sdk同一个文件目录下。

然后打开eclipse,选择菜单栏上的[Window->Perferences->Android->NDK]设置 NDK Loaction 为

D:\androidEclipse\Android\android-ndk-r10e

这时候ndk 就算安装成功了,

接下来是opencv的安装。从官网上下载opencv下来。解压后是一个包:

这里的sdk 就是eclipse上的一个工程(其实sanmples中也有一些工程,只是这里不用),这个工程其实是一个opencv 的library工程。。然后我们就需要在eclipse里面导入这个库工程:

将OpenCV-2.4.3.2-android-sdk中的sdk目录copy至工作空间,并将其更名为OpenCV-SDK(是否更改名称无所谓,这是我个人习惯而已)

在eclipse显示就是:

然后说下用c++api开发android(源码是借鉴的http://blog.csdn.net/pwh0996/article/details/8957764):

创建新工程GrayProcess2(我为了不出现appcompat_v7_,我把android创建的版本改成了4.0 ,其实4.0以上都可以),将rr1.jpg添加到资源文件,并按上面所示将opencv类库添加到工程中。

注意新建的GrayProcess2安卓工程 的包名叫com.iron.grayprocess2。工程名就是GrayProcess2。新建了一个activity叫MainActivity。这个activity的布局文件叫main.xml。

(1)Stings.xml

[html] view plaincopy

  1. <resources>
  2. <string name="app_name">GrayProcess2</string>
  3. <string name="hello_world">Hello world!</string>
  4. <string name="menu_settings">Settings</string>
  5. <string name="title_activity_main">GrayProcess2</string>
  6. <string name="str_proc">gray process</string>
  7. <string name="str_desc">image description</string>
  8. </resources>

因为这里<string name="menu_settings">Settings</string> 所以 这个需要在建好的工程中的res/menu/main.xml中改成android:title="@string/menu_settings。不然不对应。

(2)main.xml

[html] view plaincopy

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:orientation="vertical"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent" >
  6. <Button
  7. android:id="@+id/btn_gray_process"
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. android:text="@string/str_proc"/>
  11. <ImageView
  12. android:id="@+id/image_view"
  13. android:layout_width="wrap_content"
  14. android:layout_height="wrap_content"
  15. android:contentDescription="@string/str_proc"/>
  16. </LinearLayout>

(3)MainActivity.java(在com.iron.grayprocess2包内)

[java] view plaincopy

  1. package com.iron.grayprocess2;  
  2. import org.opencv.android.BaseLoaderCallback;  
  3. import org.opencv.android.LoaderCallbackInterface;  
  4. import org.opencv.android.OpenCVLoader;  
  5. import android.os.Bundle;  
  6. import android.app.Activity;  
  7. import android.graphics.Bitmap;  
  8. import android.graphics.BitmapFactory;  
  9. import android.graphics.Bitmap.Config;  
  10. import android.view.View;  
  11. import android.view.View.OnClickListener;  
  12. import android.widget.Button;  
  13. import android.widget.ImageView;  
  14. public class MainActivity extends Activity implements OnClickListener{  
  15. private Button btnProc;  
  16. private ImageView imageView;  
  17. private Bitmap bmp;  
  18. //OpenCV类库加载并初始化成功后的回调函数,在此我们不进行任何操作
  19. private BaseLoaderCallback  mLoaderCallback = new BaseLoaderCallback(this) {  
  20. @Override
  21. public void onManagerConnected(int status) {  
  22. switch (status) {  
  23. case LoaderCallbackInterface.SUCCESS:{  
  24. System.loadLibrary("image_proc");  
  25. } break;  
  26. default:{  
  27. super.onManagerConnected(status);  
  28. } break;  
  29. }  
  30. }  
  31. };  
  32. @Override
  33. public void onCreate(Bundle savedInstanceState) {  
  34. super.onCreate(savedInstanceState);  
  35. setContentView(R.layout.main);  
  36. btnProc = (Button) findViewById(R.id.btn_gray_process);  
  37. imageView = (ImageView) findViewById(R.id.image_view);  
  38. //将lena图像加载程序中并进行显示
  39. bmp = BitmapFactory.decodeResource(getResources(), R.drawable.rr1);  
  40. imageView.setImageBitmap(bmp);  
  41. btnProc.setOnClickListener(this);  
  42. }  
  43. @Override
  44. public void onClick(View v) {  
  45. int w = bmp.getWidth();  
  46. int h = bmp.getHeight();  
  47. int[] pixels = new int[w*h];       
  48. bmp.getPixels(pixels, 0, w, 0, 0, w, h);  
  49. int[] resultInt = ImageProc.grayProc(pixels, w, h);  
  50. Bitmap resultImg = Bitmap.createBitmap(w, h, Config.ARGB_8888);  
  51. resultImg.setPixels(resultInt, 0, w, 0, 0, w, h);  
  52. imageView.setImageBitmap(resultImg);      
  53. }  
  54. @Override
  55. public void onResume(){  
  56. super.onResume();  
  57. //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是
  58. //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存在于OpenCV安装包的apk目录中
  59. OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback);  
  60. }  
  61. }

OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback); 这行代码中之前代码写的是2_3_4 我一开始的时候没看,所以怎么弄也不对,说道这里 还有一定要记得 你在手机上运行你这个 Grayprocess2 项目的时候,手机上要按之前下载好的那个apk包中的apk ,你从中选一个apk试试安装看行不行,我的是下图画红框的那个就可以。之前之所以怎么弄也不对,因为你看下载好的opencv manager 都是3-0-0版本的,我这里代码没改,还是2-3-4版本的,肯定就不行啊。所以人家的代码一定要仔细读,不要一下子就贴上了。

(4) ImageProc.java(也是在com.iron.grayprocess2包内)

[java] view plaincopy

  1. package com.iron.grayprocess2;  
  2. public class ImageProc {  
  3. public static native int[] grayProc(int[] pixels, int w, int h);  
  4. }

编写JNI及C相关代码

在项目中新建目录jni,在jni目录中分别添加文件Android.mk,Application.mk,ImageProc.h,ImageProc.cpp,这次个文件都要有,其中那个.h 文件编译的时候再说。其余三个文件的内容分别如下所示。

(1) Android.mk

[plain] view plaincopy

  1. LOCAL_PATH := $(call my-dir)  
  2. include $(CLEAR_VARS)  
  3. include ../OpenCV-SDK/native/jni/OpenCV.mk  
  4. LOCAL_SRC_FILES  := ImageProc.cpp  
  5. LOCAL_MODULE     := image_proc  
  6. include $(BUILD_SHARED_LIBRARY)

注意这里的include include ../OpenCV-SDK/native/jni/OpenCV.mk 要改成自己的地址:D:\OpenCV-android-sdk\sdk\native\jni\OpenCV.mk  很重要它是将OpenCV类库中的编译文件包含进来,如此一来在我们的工程中即可使用OpenCV类库;

我之前就是随便就写上了,没有改,我发现很多错误都是我没自己读人家的代码,自己就贴上去了,其实人家很多和你的路径啊,版本啊不一样,你要改一下。很多错误都不是什么大错误,都多是不细心。不要慌,慢慢来。肯定可以的。

代码说明:

第一行:指明当前编译路径;

第二行:清空变量;

第三行:将OpenCV类库中的编译文件包含进来,如此一来在我们的工程中即可使用OpenCV类库;

第四行:指定需要编译的C++源文件;

第五行:指定编译生成的类库名称;

第六行:调用命令将源文件编译为静态库。

注:第三行指定的路径很关键,当opencv类库与工程路径相关位置发生改变时,此路径也要随之改变。

(2) Application.mk(配置文件)(这个一般不需要改)

[plain] view plaincopy

  1. APP_STL := gnustl_static  
  2. APP_CPPFLAGS := -frtti -fexceptions  
  3. APP_ABI := armeabi-v7a  
  4. APP_PLATFORM := android-8

(3)ImageProc.cpp

[cpp] view plaincopy

  1. #include <ImageProc.h>
  2. #include <opencv2/core/core.hpp>
  3. #include <string>
  4. #include <vector>
  5. using namespace cv;  
  6. using namespace std;  
  7. JNIEXPORT jintArray JNICALL Java_com_iron_grayprocess2_ImageProc_grayProc(JNIEnv* env, jclass obj, jintArray buf, jint w, jint h){  
  8. jint *cbuf;  
  9. cbuf = env->GetIntArrayElements(buf, false);  
  10. if(cbuf == NULL){  
  11. return 0;  
  12. }  
  13. Mat imgData(h, w, CV_8UC4, (unsigned char*)cbuf);  
  14. uchar* ptr = imgData.ptr(0);  
  15. for(int i = 0; i < w*h; i ++){  
  16. //计算公式:Y(亮度) = 0.299*R + 0.587*G + 0.114*B
  17. //对于一个int四字节,其彩色值存储方式为:BGRA
  18. int grayScale = (int)(ptr[4*i+2]*0.299 + ptr[4*i+1]*0.587 + ptr[4*i+0]*0.114);  
  19. ptr[4*i+1] = grayScale;  
  20. ptr[4*i+2] = grayScale;  
  21. ptr[4*i+0] = grayScale;  
  22. }  
  23. int size=w * h;  
  24. jintArray result = env->NewIntArray(size);  
  25. env->SetIntArrayRegion(result, 0, size, cbuf);  
  26. env->ReleaseIntArrayElements(buf, cbuf, 0);  
  27. return result;  
  28. }

上图代码中 有一个 #include <ImageProc.h>  所以我们要注意,在之后我们 编译出来的.h文件需要和这个里的<ImageProc.h>名字一样才可以。只有这俩相互一样就行,具体名字是什么,自己可以定,和.cpp文件名字不要求一样。  .cpp文件的名字要和Android.mk中的LOCAL_SRC_FILES值一样。

还有我们知道我们在某个java 类中的方法是public class ImageProc {

public static native int[] grayProc( int[] pixels, int w, int h);}

这么写的,这个类的方法名字是grayProc ,我们的方法实现是用c++写的。我们会把这个java 类 的.class文件编译成.h文件(具体怎么弄下面会说),这个是自动编译的。编译好以后我们发现.h文件名字是Java_com_iron_grayprocess2_ImageProc_grayProc。这是一种格式。我们不能改。并且我们知道我们是在cpp文件中实现了 头文件中的方法,那么我们要注意,我们在cpp中实现的那个方法名字应该和h文件中定义的那个名字应该和这里的一样,都是Java_com_iron_grayprocess2_ImageProc_grayProc。

你把上面的内容都写好以后,肯定是由错误的。这时候我们就要改一下错误。

我们首先要看看那个刚才import 的opencv library 库工程在eclipse上显示的是不是library(因为要给grayprocess2工程引用,所以这个opencv库工程得是library),具体的:右键opencv library 工程,然后properties》android 就出现了下面这个画面,看看是不是is library,如果不是的话就需要打钩。

然后我们就需要将这个opencv library 库工程引入到 刚才的grayprocess2 工程里。这一步很容易出错。我也只能说下我自己遇到的问题。

首先按照网上说的

在Package Explorer中选择项目GrayProcess,单击右键在弹出菜单中选择Properties,然后在弹出的Properties窗口中左侧选择Android,然后点击右下方的Add按钮,选择OpenCV Library 2.4.3并点击OK,操作完成后,会将OpenCV类库添加到GrayProcess的Android Dependencies中,

如图:

但是这时候按上面说的我应该在工程上看到显示将OpenCV类库添加到GrayProcess的Android Dependencies。但是一开始不知道为什么没有显示。弄了好几次都不显示(包括重启),问别人,别人说将这个opencv 打包成jar以后再添加到GrayProcess工程的libs文件夹中,还是不行(这个可能是因为opencv的那个库里面还有c++的代码把,不能直接打包成jar)。所以我继续想办法怎么让GrayProcess工程引用这个opencv library 库工程。然后又在网上找了找。

网上一般有两种做法(加上上面那个是三种):

1 。(网上说的最多的)
右键GrayProcess项目->build path->configure build path->project选项卡->.点击add,将opencv library库项目加入即可。如图:

2 。 

或者右键GrayProcess项目 --》properties-》Project Reference-->要添加的工程中引用过来

我鼓捣好了以后,我再用

在Package Explorer中选择项目GrayProcess,单击右键在弹出菜单中选择Properties,然后在弹出的Properties窗口中左侧选择Android,然后点击右下方的Add按钮,选择OpenCV Library 2.4.3并点击OK,操作完成后,会将OpenCV类库添加到GrayProcess的Android Dependencies中,

这个方法,然后我发现OpenCV类库添加到GrayProcess的Android Dependencies中了(在GrayProcess工程列表中Android Dependencies显示出来了,虽然不知道为啥又显示了)。如图:

这时候如果我把上面那两个方法添加的打钩什么的去掉,好像也可以了。(在GrayProcess工程列表中还是Android Dependencies显示出来了,不知道为什么)

还有导航栏中出现了project 选项的下拉菜单中 build automatically 这个选项要打上勾,不打钩好像也出现了一些错误。不知道为什么。

然后我的就没啥问题了,不知道你的还有没有问题(慢慢找,不要急,我觉得大部分都是那个工程右键 properties界面中的一些东西没配置好)

然后我的Grayprocess2就可以引用opencv library 库工程了。

接下来 还有一个问题,这个问题是我编译之后又出现的问题,不过这个先提前说了吧(不然会在ImageProc.cpp提示android Unresolved inclusion: <opencv2/core/core.hpp>)。解决办法就是:添加下图中include directories 红色的框中的东西(当然include directories里面的东西都要有,只是其他的以前都有了)

上面还说要改下:

其中的

  • C/C++ build -> build command -> ${NDKROOT}/ndk-build (in Windows it's ndk-build.cmd I think)
  • C/C++ -> Environment -> add NDKROOT

但我的好像直接用default build command就可以了。

接下来就是编译了:

在编译之前注意,在之前项目中新建目录jni了,在jni目录中分别添加文件Android.mk,Application.mk,ImageProc.cpp,还差一个ImageProc.h文件。具体生成步骤(摘录的http://blog.csdn.net/pwh0996/article/details/8957764 加了一个提示):

生成.h 文件

1.首先当写完ImageProc.java 这个保存 以后 eclipse会自动帮你生成 java 的class文件

你可以在工程目录--》 bin --》classes -》com -------。。。。。 的文件里找到

比如我的 在E:\work\op\OpenCV-2.4.5-android-sdk\samples\Test2\bin\classes\com\test2\test2 这个路径下

如图

2.将classes文件(注意是他上面所对应的classses文件夹,不只是ImageProc.class文件)拷贝(是拷贝,不是剪切)到e盘根目录下

然后打开 cmd 

e:

cd classes

javah com.test2.test2.ImageProc (如果你设置java 的环境变量,要设置。设置完记得要重启cmd,不然不管用)

然后就会在classes文件里找到一个 xxx.的头文件 如图

你可以将这个头文件改成任意名字 比如我们上面的ImageProc.h 然后放入工程目录的jni中

然后就是编译了:

因为是新版的,我们不再需要什么 Cygwin 和Sequoyah了。做法很简单:

右键工程 Android Tools 下面的 Add Native Support,我没法截图了(好像跟import 工程一样,你import 一个工程以后,就不能再import 了,这里你add native support以后,就不能再add了,没那个选项了),从网上摘录人家的,如图:

然后你再1、“Ctrl+B”build工程;2、右键->Run As..->Android Application...会可以了。

是不是这种编译很简单啊。如果想具体了解,这个帖子还不错,推荐给大家:http://blog.csdn.net/houshunwei/article/details/17217695

完工。

主要参考:http://blog.csdn.net/pwh0996/article/details/8957764

http://jingyan.baidu.com/article/3ea51489e7a9bd52e61bbac7.html

http://blog.csdn.net/houshunwei/article/details/17217695

ndk+opencv安装+各种错误分析(新版安装,编译不需要Cygwin 和Sequoyah了)的更多相关文章

  1. 【Python+OpenCV】人脸识别基于环境Windows+Python3 version_3(Anaconda3)+OpenCV3.4.3安装配置最新版安装配置教程

    注:本次安装因为我要安装的是win10(64bit)python3.7与OpenCV3.4.3教程(当下最新版,记录下时间2018-11-17),实际中这个教程的方法对于win10,32位又或是64位 ...

  2. 试安装pyQt5+eric6+python安装

    1.先安装pip最新版 安装之前把sit-packages----pip旧版本删掉 然后再cmd输入pip install --user update pip 2.安装pyqt5 pip instal ...

  3. OpenCV使用CMake和MinGW的编译安装

    官方教程:https://wiki.qt.io/How_to_setup_Qt_and_openCV_on_Windows 软件环境: Qt:5.11 CMake-3.14.4 OpenCV-4.1. ...

  4. centos7编译安装git最新版

    假如系统已经安装了git,先删除. 如果是通过yum安装的,直接在终端使用以下指令删除: yum remove git 如果是通过源码编译安装的,参考以下文章: Linux ./configure & ...

  5. 【OpenCV入门教程之一】 安装OpenCV:OpenCV 3.0、OpenCV 2.4.8、OpenCV 2.4.9 +VS 开发环境配置

    本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/19809337 作者:毛星云(浅墨 ...

  6. ubuntu16.04编译安装mysql-boost-5.7.21并编译成php扩展测试与使用

    我之前的文章已经改造了自定义MVC框架中的工具类(验证码,图片上传,图像处理,分类)4个类,接下来,就要改造模型类,模型类肯定要连接数据库,由于我的Ubuntu Linux是裸装的php(目前只编译了 ...

  7. vim的编译安装及其插件YouCompleteMe安装

    相关的环境: win 7 x64 vs2013 community python 2.7.10 AMD64 python 3.5 AMD64 LLVM 3.5 cmake 3.5   YouCompl ...

  8. CentOS 6编译安装lamp,并分别安装event模块方式和FPM方式的PHP

    任务目标: 编译安装LAMP 要求(1) 安装一个模块化的PHP 要求(2) 安装一个FPM的PHP 注意PHP需要最后一个安装,因为需要前两者的支持. 所以这里的安装次序为 1.httpd 2.Ma ...

  9. linux下编译安装vim7.4并安装clang_complete插件

    linux下编译安装vim7.4并安装clang_complete插件 因为debian里软件仓库中下载安装的vim是不支持python写的插件的(可以打开vim,在命令模式先输入:py测试一下),导 ...

随机推荐

  1. 002-使用java类调用quartz

    一.工具类 package com.tech.jin.jobScheduler; import java.text.ParseException; import java.util.ArrayList ...

  2. Ubuntu16.04安装postgresql9.4(转发:http://www.cnblogs.com/sparkdev/p/5678874.html)

    安装前的检查 首先查看是否已经安装了旧版本: dpkg -l |grep postgresql 如果已经安装了某个版本的postgresql,请先卸载. 安装postgresql 添加postgres ...

  3. 吴超老师课程---Hadoop的伪分布安装

    1.1 设置ip地址    执行命令    service network restart    验证:         ifconfig1.2 关闭防火墙    执行命令    service ip ...

  4. Part1.2 、RabbitMQ -- Publish/Subscribe 【发布和订阅】

    python 目录 (一).交换 (Exchanges) -- 1.1 武sir 经典 Exchanges 案例展示. (二).临时队列( Temporary queues ) (三).绑定(Bind ...

  5. Django-MTV(Day66)

    阅读目录 Django基本命令 视图层路由配置系统 视图层之视图函数 MTV模型 Django的MTV分别代表: Model(模型):负责业务对象与数据库的对象(ORM) Template(模板):负 ...

  6. vmvare11克隆centos虚拟机

    一.现在的虚拟机软件已经很强大了,基本上能省的操作配置,都能给用户考虑到 用vmvare安装虚拟机很简单,安装完成之后,对于不了解情况的人可能会发现虚拟机无法上网(共享主机ip的方式) 为了能够上网, ...

  7. day13 迭代器

    迭代器 'iterable' 可迭代的 内部含有__iter__方法的数据类型就是可迭代的 —— 可迭代协议 print(dir([])) print(dir({})) print(dir(5)) p ...

  8. List集合的ForEach扩展

           public static void ForEach<T>(this IEnumerable<T> enumerableSource, Action<T&g ...

  9. 12 Spring框架 SpringDAO的事务管理

    上一节我们说过Spring对DAO的两个支持分为两个知识点,一个是jdbc模板,另一个是事务管理. 事务是数据库中的概念,但是在一般情况下我们需要将事务提到业务层次,这样能够使得业务具有事务的特性,来 ...

  10. php debug函数

    $debug=$_GET['debug'];//是说获取url中debug变量$debug=empty($debug)?'':$debug;//如果变量不为空,赋值为$debug,为空的话赋值 ''$ ...