安装好IDE后, 会一直显示同步失败, 看看如下步骤:

需要注意的是:

-> 安装NDK      自带的NDK版本有问题    自己去下一个15版本的

-> 按照系统提示一步一步安装其他未安装的组件

-> 最终代码写好后, 需要安装自己的需要创建 android模拟器, 新建一个 X86-android4.4的模拟器;

开发android程序 - 结构:

-> AndroidManifest.xml    设置权限, 注册AppCompatActive窗口, 设置主函数入口。

-> 图片存储在res-drawable,  res-layout调用图片等资源。

使用android-studio ndk生成 so文件。

-> 创建C++接口加载器

->  手动创建插件

$JDKPath$\bin\javah
-d $ModuleFileDir$\src\main\jni -jni $FileClass$
$ModuleFileDir$\build\intermediates\classes\debug

  

->  build project 一下

-> 在OpenCVHelper类上右键, 选择External Tool 使用插件

-> 编辑C文件

#include "com_admin_opencv4android_OpenCVHelper.h"
#include <sstream> JNIEXPORT jstring JNICALL
Java_com_admin_opencv4android_OpenCVHelper_getStringTmp(JNIEnv *env, jclass instance){
std::stringstream ss;
ss << "Hello from c++ " << std::endl;
return env->NewStringUTF(ss.str().c_str());
}

  

新建 Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) LOCAL_MODULE := OpenCVHelper
LOCAL_SRC_FILES := MyLib.cpp
include $(BUILD_SHARED_LIBRARY)

  

新建  Application.mk

APP_ABI := all
APP_STL:=stlport_static

  

->  使用命令行进入jni目录,  使用ndk命令编译so

->  调用刚才生成好的 so

在app/build 下

android {
...
sourceSets {
main() {
jniLibs.srcDirs = ['src/main/libs']
jni.srcDirs = [] //屏蔽掉默认的jni编译生成过程
}
}
}

  

在主程序中:

public class MainActivity extends AppCompatActivity {

    private TextView textView;

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.sample_text);
textView.setText(OpenCVHelper.getStringTmp());
}
}

  

使用android studio 整合 opencv第三方库:

->  在OpenCVHelper中新增接口函数:

public class OpenCVHelper {

    static {
System.loadLibrary("OpenCVHelper");
} public static native String getStringTmp();
public static native int[] getGrayImage(int[] pixels, int w, int h);
}

  

->  重写MyLib.cpp:

#include "com_admin_opencv4android_OpenCVHelper.h"
#include <sstream>
#include <opencv2/opencv.hpp> JNIEXPORT jstring JNICALL
Java_com_admin_opencv4android_OpenCVHelper_getStringTmp(JNIEnv *env, jclass instance){
std::stringstream ss;
ss << "Hello from c++ " << std::endl;
return env->NewStringUTF(ss.str().c_str());
} JNIEXPORT jintArray JNICALL
Java_com_admin_opencv4android_OpenCVHelper_getGrayImage(JNIEnv *env, jobject, jintArray buf, int w, int h){
jint *pixels = env->GetIntArrayElements(buf, NULL);
if(pixels == NULL){
return NULL;
}
cv::Mat imgData(h, w, CV_8UC4, pixels);
uchar *ptr = imgData.ptr(0);
for(int i=0; i<w*h; i++){
int grayScale = (int)(ptr[4*i+2]*0.299 + ptr[4*i+1]*0.587 + ptr[4*i+0]*0.114);
ptr[4*i+0] = (uchar)grayScale;
ptr[4*i+1] = (uchar)grayScale;
ptr[4*i+2] = (uchar)grayScale;
}
int size = w * h;
jintArray result = env->NewIntArray(size);
env->SetIntArrayRegion(result, 0, size, pixels);
env->ReleaseIntArrayElements(buf, pixels, 0);
return result;
}

  

所有配置请参照opencv官网,    https://docs.opencv.org/2.4/doc/tutorials/introduction/android_binary_package/dev_with_OCV_on_Android.html#native-c

-> Android.mk :

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
OPENCV_LIB_TYPE:=STATIC
include D:/library/OpenCV-android-sdk/sdk/native/jni/OpenCV.mk LOCAL_MODULE := OpenCVHelper
LOCAL_SRC_FILES := MyLib.cpp
include $(BUILD_SHARED_LIBRARY)

  

-> Application.mk

APP_ABI := all
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions

  

->  配置好之后, 使用ndk-build

-> activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.admin.opencv4android.MainActivity"> <TextView
android:id="@+id/sample_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="aa!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" /> <ImageView
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/tutu"
android:layout_centerInParent="true" />
<Button
android:id="@+id/bt_Gray"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:text="Gray" /> </android.support.constraint.ConstraintLayout>

  

-> MainActivity类:

public class MainActivity extends AppCompatActivity {

    private TextView textView;
private Button bt_photo; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.sample_text);
textView.setText(OpenCVHelper.getStringTmp()); bt_photo = (Button) findViewById(R.id.bt_Gray);
bt_photo.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
ImageView img = (ImageView) findViewById(R.id.img);
Bitmap bitmap = ((BitmapDrawable) getResources().getDrawable(
R.drawable.tutu)).getBitmap();
int w = bitmap.getWidth(), h = bitmap.getHeight();
int[] pix = new int[w * h];
bitmap.getPixels(pix, 0, w, 0, 0, w, h);
int[] resultPixes = OpenCVHelper.getGrayImage(pix, w, h);
Bitmap result = Bitmap.createBitmap(w, h, Bitmap.Config.RGB_565);
result.setPixels(resultPixes, 0, w, 0, 0, w, h);
img.setImageBitmap(result);
}
}); }
}

  

->   至于Cmake之类的,  可以全部注释,  jni全部删除都可以,  因为已经有so了, 甚至头文件都不需要:

##################################################################################

-> 在上述案例中, 是在 jni文件夹中  使用Android.mk 导入存储在本地(项目文件外面)的第三方静态库, 使得jni中需要编译的程序 MyLib.cpp可以引用opencv,   并指定 LOCAL_MODULE := OpencvHelper

-> 编译好后的 .so 通过build.gradle   jniLibs.srcDirs = ['src/main/libs']  在编译器链接动态库,

-> 在实现native的接口类中,  System.loadLibrary("OpenCVHelper"); 在java程序中加载动态库。

编译zbar生成其动态库, 并调用摄像头扫描二维码。

->  使用zbar, libiconv编译 .so,  并使用java编写扫描程序的项目:   https://blog.csdn.net/yanzhenjie1003/article/details/71641368

-> 添加完整工程zbar, 对第一次使用android studio ndk的人来说 难度不小,  不如先从一个小案例做起:

新建一个 first.h  头文件

#ifndef OPENCV4ANDROID_COMPILE_ZBAR_FIRST_H
#define OPENCV4ANDROID_COMPILE_ZBAR_FIRST_H
int add(int input);
#endif //OPENCV4ANDROID_COMPILE_ZBAR_FIRST_H first.cpp #include "first.h" int add(int input)
{
return input * 2;
} 在交叉接口 MyLib.cpp 中: #include "com_admin_opencv4android_ZbarHelper.h"
#include <sstream>
#include "first.h" JNIEXPORT jstring JNICALL
Java_com_admin_opencv4android_ZbarHelper_getStringTmp(JNIEnv *env, jclass instance, jint prompt){ int c = prompt;
int result = add(c); std::stringstream ss;
ss << "Hello from c++ " << std::endl;
ss << result << std::endl; return env->NewStringUTF(ss.str().c_str());
}

  

Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) LOCAL_MODULE := ZbarHelper LOCAL_SRC_FILES := \
first.cpp \
MyLib.cpp LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/first.h \ include $(BUILD_SHARED_LIBRARY)

  

在第一次使用ndk编译时,   总提示    undefine   function  add() ..... ,     我反复检查 无论是在 LOCAL_SRC_FILES, LOCAL_C_INCLUDES 中该函数的 头文件 或 实现函数 都在classpath下, 不会有错!

最终查明,  在使用ndk编译时,  需要将CMakeLists.txt 中的所有选项都注释掉,  就不会找不到引用。

在使用ndk编译c++时, 报错 找不到 #include exception , 因为ndk编译器 默认最小库编译,  因此在 Application.mk里添加   APP_STL := gnustl_static    APP_CPPFLAGS := -frtti -fexceptions

在做平台移植时, 最麻烦的问题在于 要考虑 目标平台编译器的问题。

android.mk 使用进阶:

对编译成功的so库  进行预编译加载

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := zbar
LOCAL_SRC_FILES := libs/libzbar.so LOCAL_EXPORT_C_INCLUDES := \
$(LOCAL_PATH)/include \
$(LOCAL_PATH)/zbar
include $(PREBUILT_SHARED_LIBRARY) 调用该库
## ------------------------------------- include $(CLEAR_VARS) LOCAL_MODULE := ZbarHelper LOCAL_C_INCLUDES += \
$(LOCAL_PATH)/include \
$(LOCAL_PATH)/zbar \ LOCAL_SRC_FILES := MyLib.cpp LOCAL_SHARED_LIBRARIES := \
zbar include $(BUILD_SHARED_LIBRARY)

  

一些参考资料地址:             https://www.cnblogs.com/tt2015-sz/p/6148723.html

ndk-build 时, 找不到 mathcalls.h 系统库,   将 APP_PLATFORM := android-19,  因为之前的系统库 没有相应的库。

												

只能用Android studio做平台移植了! 在Windows10下, 开发Android。的更多相关文章

  1. [Learn Android Studio 汉化教程]第三章:使用 Android Studio 编程

    [Learn Android Studio 汉化教程]第三章:使用 Android Studio 编程 本章包含如何在 Android Studio 中书写或生成代码. Android Studio ...

  2. 【Android Studio安装部署系列】二十五、Android studio使用NDK生成so文件和arr文件

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 Android Studio使用ndk的简单步骤. NDK环境搭建 下载NDK 下载链接:https://developer.and ...

  3. 【Android Studio安装部署系列】二十四、Android studio中Gradle插件版本和Gradle版本关系

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 在从Android Studio3.0.0版本升级到Android Studio3.0.1版本的时候,出现了一个问题,需要升级Gra ...

  4. 【Android Studio安装部署系列】三十、从Android studio2.2.2升级到Android studio3.0之路

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 Android Studio 3.0的新功能 https://mp.weixin.qq.com/s/2XmVG4mKEDX6-bvZ ...

  5. 【Android Studio安装部署系列】三十二、Android模拟器Genymotion安装使用教程详解

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 一.注册\登录 打开Genymotion官网,https://www.genymotion.com/ ,首先点击右上角的Sign in进行 ...

  6. 安装Android studio出现'tools.jar' seems to be not in Android Studio classpath......的解决方法

    安装Android studio出现'tools.jar' seems to be not in Android Studio classpath......的解决方法 原创 2015年07月31日 ...

  7. android studio: Rejecting re-init on previously-failed class java.lang.Class<android.support.v4.view.ViewCompat$OnUnhandledKeyEventListenerWrapper>: java.lang.NoClassDefFoundError: Failed resolution o

    今天在运行部署项目时logcat弹出下列错误: -- ::-/? E/Zygote: v2 -- ::-/? I/libpersona: KNOX_SDCARD checking this -- :: ...

  8. Android Studio NDK 代码 Source Insight调试 (NDK 目前开发方案 | NDK 编译 | 导入 so 库 | 项目编码转换)

    作者 : 韩曙亮 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/52088039 最近在移植一个 JNI 项目, 比较纠结, A ...

  9. 【Android Studio安装部署系列】二十八、Android Studio查看其它APP的布局结构

    概述 日常使用别家的APP过程中,会遇到一些比较好看的布局,这时候我们就想学习一下别人的布局结构,以便参考. (1)手机连接电脑.设置手机为USB调试模式 参考<[Android Studio安 ...

随机推荐

  1. [C# 设计模式] Iterator - 迭代器模式:我与一份奥利奥早餐的故事

    Iterator - 迭代器模式 目录 前言 回顾 UML 类图 代码分析 抽象的 UML 类图 思考 前言 这是一包奥利奥(数组),里面藏了很多块奥利奥饼干(数组中的元素),我将它们放在一个碟子上慢 ...

  2. 让Mongo在Spring中跑起来

    本文标题为<让Mongo在Spring中跑起来>,旨在Spring中如何成功连接MongoDB并对其进行增删改查等操作,由于笔者也是刚接触,对其中的一些原由也不甚了解,若有错误之处,敬请指 ...

  3. 小程序多端框架全面测评:chameleon、Taro、uni-app、mpvue、WePY

    摘要: 微信小程序开发技巧. 作者:coldsnap 原文:小程序多端框架全面测评 Fundebug经授权转载,版权归原作者所有. 最近前端届多端框架频出,相信很多有代码多端运行需求的开发者都会产生一 ...

  4. 简单介绍Tomcat

    Tomcat是一个Web容器,或者说是Web服务器.用于管理和部署Web应用.还有一种服务器叫做应用服务器,它的功能比web服务器要强大的多,因为它可以部署EJB应用,可以实现容器管理的事务,一般的应 ...

  5. 动态BGP和静态BGP的含义与区别

    1.在华为云上选购虚拟机时,会让用户选择动态BGP还是静态BGP, 全动态BGP可根据设定的寻路协议第一时间自动优化网络结构,以保持客户使用的网络持续稳定.高效. 静态BGP中的网络结构发生变化,运营 ...

  6. mysql安装出现问题(The service already exists)

    1.管理员身份运行cmd(系统win10) 2.输入命令cd /d F:\mysql-5.7.19-win32\bin(此为mysql要安装的目录) 3.输入安装命令mysqld install 出现 ...

  7. SQL Server查看视图定义总结

      在SQL Server中如何查看数据库视图的定义呢? 其实官方文档已经有一个较详细的总结了,这里在官方文档的基础上,我们再深入展开分析一下,例如如何获取系统视图的定义.知其然知其所以然吗. 1:使 ...

  8. SQLServer之视图简介

    视图定义 视图是一个虚拟表,其内容由查询定义. 同表一样,视图包含一系列带有名称的列和行数据. 视图在数据库中并不是以数据值存储集形式存在,除非是索引视图. 行和列数据来自由定义视图的查询所引用的表, ...

  9. LeetCode算法题-Shortest Unsorted Continuous Subarray(Java实现)

    这是悦乐书的第267次更新,第281篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第134题(顺位题号是581).给定一个整数数组,找到一个连续的子数组,按升序对该子数组 ...

  10. Angular安装及创建第一个项目

    Angular简介 AngularJS 诞生于2009年,由Misko Hevery 等人创建,后为Google所收购.是一款优秀的前端JS框架,已经被用于Google的多款产品当中.AngularJ ...