利用jni将Eclipse与C++、Opencv无缝连接

2023-11-03

利用jniEclipseC++Opencv无缝连接

博主:w风的季节

日期:2018/4/11

 

现在越来越多的大学生实验室或者创新项目需要用到将JAVA与C++之间的混合编程,因此本篇就来讲解一下Eclipse中用java写的APP如何将C++算法程序无缝融入进去。

本篇博客主要是针对初学Ecilpse的博友们,从配置JAVA环境变量开始讲起,最终实现可以开发一个将用C++编写的图像处理程序于java编写的程序链接起来,最终在Android上开发出APP。

写本篇文章的目的是主要是因为小编刚跟老师做完一个大学生创新创业项目,而且主要工作是将C++编写的图像处理程序一直到Android中,并根据这个来开发一个小型APP。经过大约不到一年的实践与学习,项目成果还不错,因此特来把我在做过程中遇到的问题以及Eclipse配置jni的方法详细给大家讲述一下,以免大家少走一些弯路(小编就在此之前被折磨惨了,整天看不完的资料,搜各种花式问题)。

本文写的图像处理函数比较简单,主要是为了给初学者留一点自己理解的时间,只用到Opencv函数库中的几个函数,后续等小编有时间,继续给大家编写更难一点,对工程项目有实际作用的C++程序嵌入。

本篇文章主要是借鉴这位博主的文章,下面是这位博主发表的文章链接,大家也可以去参考一下: https://blog.csdn.net/watkinsong/article/details/9849973

 

下面是本篇文章讲解所用的的全部资源包(本文全部都要用到),主要包括:

(百度网盘)

 

jdk-jre.zip

https://pan.baidu.com/s/10sIvW-D1rxUnUmhdP1wR-Q

密码:ziu0

ADT-23.0.7.zip

https://pan.baidu.com/s/1AJqzSW09O19snQhcJAQFZw

密码:atps

eclipse-jee-oxygen-3-win32-x86_64.zip

https://pan.baidu.com/s/1EV6GAWfqptBayEEvOycYTA

密码:4bif

android-ndk64-r10-windows-x86_64.zip

https://pan.baidu.com/s/1tgnIQGoQmpAu80l2p27wfw

密码:i9i2

android-sdk_r24.4.1-windows.zip

https://pan.baidu.com/s/1Rrv7HG-tHsMNcP85ROqTzA

密码:pph1

opencv-3.4.1-android-sdk.zip

https://pan.baidu.com/s/1NInNkBnqwtyqcVWA2nFcyw

密码:lgds

 

以下是本篇文章的大体方向:

1、             安装jdk-8u162(包含jre),配置java环境变量;

2、             安装Eclipse;

3、             在Eclipse中离线安装ADT;

4、             下载并安装SDK;

5、             新建Android工程;

6、             配置Android NDK环境;

7、             将C++编译为动态链接库(.so库);

 

8、             调用.so库函数,实现功能

 

一、配置java环境变量

1、安装jdk与jre

1.1从上面提供的资源包中,解压jdk-jre压缩包到当前文件夹下:

 

 

1.2、从解压好的文件夹下找到jdk-8u162-windows-x64.exe双击运行,点击下一步如下图所示:注意红线区为保存的路径,可以更改。

 

  

 

 

 

  

 

2、Java环境变量配置

 2.1、右击 计算机→属性→高级系统设置→高级→环境变量

 

 

 

2.2、系统变量→新建 JAVA_HOME 变量,变量值是你安装jdk时文件夹,与下有图的路径一致,不要配置错了,如下两图所示:

 

 

 

 

 

2.3、系统变量→寻找 Path 变量→编辑,新建两个分别输入:

%JAVA_HOME%\bin

%JAVA_HOME%\jre\bin

 

 

 

2.4、系统变量→新建 CLASSPATH 变量

变量值填写  .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar(注意最前面有一点)

系统变量配置完毕,如下图所示:

 

 

 

2.5、检验是否配置成功运行cmd输入javac或者java –version(注意有空格)

若如图所示显示版本信息则说明安装和配置成功:

 

 

二、安装eclipse

2.1、如下图,解压到当前文件夹

 

 

 

2.2、打开解压后的文件夹,双击运行eclipse.exe应用程序

 

 

 

2.3、运行后,会出现一下界面,你需要找一个保存工程的文件夹(最好与应用程序在同一文件夹下),并勾选(以后默认工程在此文件夹下),如图所示:

 

 

三、离线安装ADT

3.1、打开Eclipse,点击Help ->Install New Software:

 

 

 

3.2、之后到如下界面点击Add,按照下图所示操作,然后点击Archive,添加ADT压缩包ADT-23.0.7.zip(此压缩包均在本文开头所给的文件夹下,需要博友们先下载下来):

 

 

 

 

 

 

3.3、点击ok之后便可以到一下界面,然后经过Pending解析后,就可以看到对应的:Developer Tools了:

 

 

 

3.4等待下载完之后可以看到如下界面:

 

 

 

 

3.5不要急,等待一小会,中间会有安全提示,点击Installanyway即可:

 

 

3.6、点击Restart Now重启Eclipse

 

 

 

3.7重启Eclipse之后,可能会出现这个窗口,可以点击红框内,也可以点击Close,最好点击Close,因为这个安装SDK的步骤会在下文再解释:

 

 

3.8、至此,离线安装ADT就完成了。另外,你也可以在工具栏中看到对应的Android小图标,这个是安装SDK用的Android SDK Manager:

 

 

四、Android SDK安装

4.1、打开资源包,解压图示所画的压缩包,(小编这里是已经解压好的):

 

 

 

4.2、打开解压后的文件夹,并双击运行SDKManager.exe

 

 

 

4.3、Tools的勾选图示选项下载即可

 

 

 

4.4、API的选择三个,考虑向下兼容原则,可以下载最新的API,这里选用API27,API26,API22。

Android 8.1.0 Android8.0.0

 

 

 

Android5.1.1

 

 

 

4.5、Extras的选择这几个(有时间和内存的话,最好这个全部都下载):

 

 

 

4.6、点击红线区开始下载,时间比较慢,建议晚上下载:

 

 

 

 

 

 

注:无法下载的会出现以下提示

 

 

 

此时采用有Android SDK在线更新镜像服务器来下载安装:

北京化工大学镜像服务器地址:

IPv4: ubuntu.buct.edu.cn/ 端口:80

IPv4: ubuntu.buct.cn/ 端口:80

IPv6: ubuntu.buct6.edu.cn/ 端口:80

大连东软信息学院镜像服务器地址: //一般用这个服务器比较快

mirrors.neusoft.edu.cn 端口:80

郑州大学开源镜像站:

mirrors.zzu.edu.cn 端口:80

使用方法:

启动 Android SDK Manager,打开主界面,依次选择『Tools』、『Options...』,弹出『Android SDK Manager - Settings』窗口;

 

在『Android SDK Manager - Settings』窗口中,在『HTTP ProxyServer』和『HTTP Proxy Port』输入框内填入上面镜像服务器地址(不包含http://,如下图)和端口,并且选中『Force https://... sources to be fetched using http://...』复选框。设置完成后单击『Close』按钮关闭『AndroidSDK Manager - Settings』窗口返回到主界面;

依次选择『Packages』、『Reload』

 

 

 

 

等待安装完成后,需要将SDK的文件安装路径配置到Eclipse上,单击“Browse…”按钮,选择你的SDK安装路径,添加好就行啦~如下图:

 

 

 

五、新建Android工程

5.1、打开eclipse,Eclipse里,选择菜单项File—>New—>Project新建一个项目,我们就能看到建立Android项目的选项了:

 

 

 

 

5.2、接下来是选择API,重点,前往别选择错!!!!!

  

 

 

 

 

 

 

 

 

到此为止,新建Android工程,完毕。

 

六、配置AndroidNDK环境

6.1、在本文的资源包里面包含android-ndk64-r10-windows-x86_64.zip,解压到当前文件夹即可,如下图:

 

 

 

6.2、打开eclipse Window—>Prefernces—>Android—>NDK选择你NDKLocation的存放路径:

 

 

 

七、将该项目转换到C++项目

7.1、首先需要将该项目转换到C++项目,使得该项目具有C++代码属性,如下所述。
点击项目,右击,New -> Other -> C/C++ -> Convert to a C/C++ Project.

 

 

 

 

 

     

7.2、配置Eclipse对cpp代码进行编译:
首先需要给当前项目添加一个编译环境变量
如下目录Eclipse ->Window -> Preferences -> C/C++ -> Build ->Environment,点击Add... 
添加一个NDKROOT,并且设置值为NDK的根目录,如下图:

 

 

 

 

7.3、在工程中设置编译的一些参数
右击你新建的工程,找到Properties,并按照顺序 Properties -> C/C++ Build, uncheck Use default build command,replace “Build command” text from "make" to
"${NDKROOT}/ndk-build.cmd" on Windows,
"${NDKROOT}/ndk-build" on Linux and MacOS.如下图:
 

 

 

7.4、然后修改Behaviour选项卡,设置编译配置(配置在保存代码的时候进行自动编译

 

 

7.5在此之后出现这种情况,不要着急,我们接着开始写C++程序,并编译成动态链接库;

 

 

八、在Android中使用Opencv

8.1、安卓java代码

8.1.1、MainActivity函数代码如下:

 

 

package com.Rng.freescale;
 
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
importandroid.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
 
public class MainActivity extendsActivity {
          ImageView imgView;  
    Button btnNDK, btnRestore;  
          @Override
          protected voidonCreate(Bundle savedInstanceState) {
                   super.onCreate(savedInstanceState);
                   setContentView(R.layout.activity_main);
  
        this.setTitle("使用NDK转换灰度图"); 
        btnRestore = (Button) this.findViewById(R.id.btnRestore);  
        btnRestore.setOnClickListener(newClickEvent());  
        btnNDK = (Button) this.findViewById(R.id.btnNDK);  
        btnNDK.setOnClickListener(newClickEvent());  
        imgView = (ImageView) this.findViewById(R.id.ImageView01);  
       @SuppressWarnings("deprecation")
                   Bitmap img =((BitmapDrawable) getResources().getDrawable(  
                R.drawable.we)).getBitmap();  
        imgView.setImageBitmap(img);  
    }  
  
    class ClickEvent implementsView.OnClickListener {  
        public void onClick(Viewv) {  
            if (v == btnNDK) {  
                long current = System.currentTimeMillis();  
               @SuppressWarnings("deprecation")
                                       Bitmapimg1 = ((BitmapDrawable) getResources().getDrawable(  
                        R.drawable.we)).getBitmap();  
                int w = img1.getWidth(),h = img1.getHeight();  
                int[] pix = new int[w* h];  
                img1.getPixels(pix, 0, w, 0, 0,w, h);  
                int[] resultInt =LibImgFun.ImgFun(pix, w, h);  
                Bitmap resultImg = Bitmap.createBitmap(w,h, Config.RGB_565);  
                resultImg.setPixels(resultInt,0, w, 0, 0, w, h);  
                long performance =System.currentTimeMillis() - current; 
               imgView.setImageBitmap(resultImg); 
                MainActivity.this.setTitle("w:"+ String.valueOf(img1.getWidth()) 
                        + ",h:" +String.valueOf(img1.getHeight()) + "NDK耗时"  
                        + String.valueOf(performance)+ " 毫秒"); 
            } else if (v ==btnRestore) {  
               @SuppressWarnings("deprecation")
                                       Bitmapimg2 = ((BitmapDrawable) getResources().getDrawable(  
                        R.drawable.we)).getBitmap();  
                imgView.setImageBitmap(img2);  
                MainActivity.this.setTitle("使用OpenCV进行图像处理"); 
            } 
        } 
    }  
}
 
 

8.1.2、在文件夹src下的com.testopencv.haveimgfun包中新建一个类用于包装使用了opencv c++代码的动态库的导出函数,类名为LibImgFun。Eclipse会为你创建一个新的文件LibImgFun.java,我们将里面的内容改为:

 

 

packagecom.Rng.freescale;
 
publicclass LibImgFun {
          static {     
       System.loadLibrary("ImgFun");     
       }   
publicstatic native int[] ImgFun(int[] buf, int w, int h);    
}
 

 

从上面的代码可以得知,我们的动态库名字应该为“libImgFun.so”,注意"public static native int[] ImgFun(int[] buf, int w, inth)"中的native关键字,表明这个函数来自native codestatic表示这是一个静态函数,这样就可以直接用类名去调用。

 

8.1.3、然后修改界面控制文件res->layout->activity_main.xml

 

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.Rng.freescale.MainActivity" >

  <Button android:layout_height="wrap_content"    
         android:layout_width="fill_parent"    
         android:id="@+id/btnNDK"    
         android:text="使用C++ OpenCV进行处理" />   
   <Button android:layout_height="wrap_content"    
         android:layout_width="fill_parent"    
         android:id="@+id/btnRestore"    
         android:text="还原" />    
   <ImageView android:id="@+id/ImageView01"    
     android:layout_width="fill_parent"    
     android:layout_height="fill_parent" /> 

</LinearLayout>
 

文件图如下:

 

 

8.2 C++代码

在项目中新建一个jni文件,用于放置该项目的所有cpp代码。在jni文件夹下建立一个"ImgFun.cpp"的文件,内容改为下面所示:

 

 

#include <jni.h>
#include <stdio.h>
#include <stdlib.h>
#include <opencv2/opencv.hpp>
using namespace cv;
IplImage * change4channelTo3InIplImage(IplImage * src);

extern "C" {
JNIEXPORT jintArray JNICALL Java_com_Rng.freescale_LibImgFun_ImgFun (
        JNIEnv* env, jobject obj, jintArray buf, int w, int h);
JNIEXPORT jintArray JNICALL Java_com_Rng.freescale_LibImgFun_ImgFun (
        JNIEnv* env, jobject obj, jintArray buf, int w, int h) {
    jint *cbuf;
    cbuf = env->GetIntArrayElements(buf, false);
    if (cbuf == 0) {
        return 0;
    }
    Mat myimg(h, w, CV_8UC4, (unsigned char*) cbuf);
    IplImage image=IplImage(myimg);
    IplImage* image3channel = change4channelTo3InIplImage(&image);
    IplImage* pCannyImage=cvCreateImage(cvGetSize(image3channel),IPL_DEPTH_8U,1);
    cvCanny(image3channel,pCannyImage,50,150,3);
    int* outImage=new int[w*h];
    for(int i=0;i<w*h;i++)
    {
        outImage[i]=(int)pCannyImage->imageData[i];
    }
    int size = w * h;
    jintArray result = env->NewIntArray(size);
    env->SetIntArrayRegion(result, 0, size, outImage);
    env->ReleaseIntArrayElements(buf, cbuf, 0);
    return result;
}
}
IplImage * change4channelTo3InIplImage(IplImage * src) {
    if (src->nChannels != 4) {
        return 0;
    }

    IplImage * destImg = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 3);
    for (int row = 0; row < src->height; row++) {
        for (int col = 0; col < src->width; col++) {
            CvScalar s = cvGet2D(src, row, col);
            cvSet2D(destImg, row, col, s);
        }
    }
    return destImg;
}
 

 

 

在上面的代码中,给出了简单的Canny算子检测边缘的代码,并且返回检测后的图像显示。
上面的代码中#include <jni.h>是必须要包含的头文件,#include <opencv2/opencv.hpp>是opencv要包含的头文件。

 

 

说明:

 

 

这个函数名,必须与java代码中的包名以及类名,函数名完全一致,

 

 

分别表示了包,类,函数名,中间用_分开,这个是非常重要的,否则会提示找不到函数的异常错误。

 

8.3 配置文件

然后再在jni下新建两个文件"Android.mk"文件和"Application.mk"文件,这两个文件事实上就是简单的Makefile文件。使用NDK进行编译的时候,需要使用Android.mk和Application.mk两个文件。

 

8.3.1如果是只有一个.cpp文件可以采用下面的Android.mk
Android.mk:

 

LOCAL_PATH := $(call my-dir)    
include $(CLEAR_VARS)    
OPENCV_LIB_TYPE:=STATIC  
ifeq ("$(wildcard $(OPENCV_MK_PATH))","")    
#try to load OpenCV.mk from default install location    
include F:\Eclipse\OpenCV-android-sdk\sdk\native\jni\OpenCV.mk   
else    
include $(OPENCV_MK_PATH)    
endif    
LOCAL_MODULE    := ImgFun  
LOCAL_SRC_FILES := ImgFun.cpp    
include $(BUILD_SHARED_LIBRARY) 
 

 

 

8.3.2如果是有多个.cpp文件则要采用下面的Android.mk
 

 

Android.mk:
 
LOCAL_PATH := $(call my-dir)  
include $(CLEAR_VARS) 
OpenCV_INSTALL_MODULES:=on
OPENCV_CAMERA_MODULES:=off 
OPENCV_LIB_TYPE:=STATIC
ifeq ("$(wildcard $(OPENCV_MK_PATH))","")  
#try to load OpenCV.mk from default install location  
include F:\Eclipse\OpenCV-android-sdk\sdk\native\jni\OpenCV.mk  
else  
include $(OPENCV_MK_PATH)  
endif  
LOCAL_MODULE    := ImgFun  
LOCAL_SRC_FILES := ImgFun.cpp \
cut.cpp \
stdafx.cpp \
lsd.cpp

include $(BUILD_SHARED_LIBRARY)

 

 

8.3.3 Application.mk

 

APP_STL:=gnustl_static  
APP_CPPFLAGS:=-frtti -fexceptions  
APP_ABI:=armeabi armeabi-v7a

 

 

8.3.4在Android.mk文件中,需要主要修改的代码是如下一行,这里要指定到opencv.mk这个文件,否则在NDK进行编译本地c/c++文件得时候会提示你找不到opencv.mk这个文件:

 

 

 

8.3.5这一行表示你的在Android中使用的Opencv.mk文件位置所在,在本文的资源包中包含了opencv-3.4.1-android-sdk.zip压缩包,解压到当前文件夹,便可以得到地址所在,将其改为你自己的解压后的文件位置,如下图:

 

 

8.3.6打开解压后的文件夹OpenCV-android-sdk -> sdk -> native ->jni ->Opencv.mk

 

 

 

8.4、编译本地C++代码

8.4.1、这里选择使用Eclipse自动进行编译,参考以下内容进行配置:

这个时候,会在C++代码中,看到非常多的错误提示,遍地都是错误提示,这里不要慌,这里只是假的错误提示,编译cpp代码能够编译通过,但是运行程序是不行的,会提示你代码有错误,需要解决这些问题。如下图所示: 

 

 

8.4.2、打开工程属性,Project Properties -> C/C++ General -> Paths and Symbols

为Assembly与GNC C++编译器添加如下路径:(这里添加的路径就是NDK中的c/c++头文件的路径)

 

 

 

 

 

 

 

 

 

 

8.4.3、点击Apply and Close后就会看到所有的错误都消失了,这样重新编译本地cpp代码,然后就可以运行工程了.

 

 

 

 

8.4.4、终于可以运行程序了,可以看到本程序的截图如下(直接在真机上测试):

 

 

 

      
 

 

总述:天呐,终于写忘了,虽然累了两天,但还是挺开心的,毕竟是小编第一次写博客嘛!但我看这些上传照片不是很清楚,如果大家感兴趣的话,可以加小编的QQ,小编把电子版的发给你,如果是在配置或者学习的过程中有什么问题,也可以给小编留言,或者大家可以加小编QQ1637850405!说实话,真的很开心,这是小编人生中发表的第一篇博客,在此立个Flag,希望可以与大家多多交流,扩大视野,随时留言哦Come On !!!

 

小编QQ:1637850405

PDF版 (百度网盘):https://pan.baidu.com/s/1kbTmETLQT6GZnKJNw_jSpQ 

 

                               密码:c2k7
 
Word版 (百度网盘):https://pan.baidu.com/s/1GZGni_yRMZ72wM22YDf6BA
                                密码:4cvn

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用jni将Eclipse与C++、Opencv无缝连接 的相关文章

随机推荐

  • 送书 | 《商品期货量化交易实战》

    今天是周三 又到了给大家送书的时刻啦 这次给大家带来的是 商品期货量化交易实战 文末查看送书规则 简介 本书首先讲解量化交易基础和Python编程入门 再讲解量化交易API 然后讲解CTA的趋势跟踪策略和回归策略 并且配合量化交易策略实战案
  • leetcode【2023】

    什么是华为OD机试 华为OD机试是华为的笔试 因为是在电脑上做题 所以称为机试 主要用于评估求职者是否适合所申请的职位 华为OD机试通常涵盖了多个测试领域 如算法构造 编程技巧以及错误修复等 其目标是全面评估求职者的基础知识 实践技能和编程
  • gojs 绘制UML连线图

  • A Survey on Deep Transfer Learning 2018 翻译

    A Survey on Deep Transfer Learning 2018 翻译 o 虽然这篇文章是2018年的 不是很新 但是写的通俗易懂 很适合刚接触迁移学习的同学 所以就翻译了 independent and identicall
  • Python基础知识(七):类、对象与魔法方法

    类与对象 1 对象 属性 方法 对象是类的实例 换句话说 类主要定义对象的结构 然后我们以类为模板创建对象 类不但包含方法定义 而且还包含所有实例共享的数据 封装 信息隐蔽技术 我们可以使用关键字 class 定义 Python 类 关键字
  • CSS3 SVG实现可爱的动物哈士奇和狐狸动画

    点击上方公众号 可快速关注 英文 David Khourshid 译文 码农网 小峰 www codeceo com article css3 svg husky and fox html 今天 我想向大家展示如何巧妙地使用HTML CSS
  • 论"大数据"时代下的海量数据存储技术

    高清 长周期呈现海量存储需求 高清已经在安防行业全面铺开应用 除了带给用户能够看得更清的良好视觉感受外 对存储容量的需求亦成几何式增长 例如 前端IPC有130W到500W像素 码流也从有2Mbps到8Mbps 而一个130W像素 8Mbp
  • 开源OCR引擎Tesseract-OCR

    Overview Tesseract的OCR引擎最先由HP实验室于1985年开始研发 至1995年时已经成为OCR业内最准确的三款识别引擎之一 然而 HP不久便决定放弃OCR业务 Tesseract也从此尘封 数年以后 HP意识到 与其将
  • VSCode 必装的 10 个高效开发插件

    本文介绍了目前前端开发最受欢迎的开发工具 VSCode 必装的 10 个开发插件 用于大大提高软件开发的效率 VSCode 的基本使用可以参考我的原创视频教程 VSCode 高效开发必装插件 VSCode Visual Studio Cod
  • jquery val() 获取不到值的问题排查

    表单校验用jquery validation 实现 基本功能很快实现 在测试时发现自定义的一个比较开始结束日期的校验不起作用 var begin param val var reg new RegExp g begin begin repl
  • arcgis 9.3 sde 安装 启动服务问题

    1 arcgis 9 3 注册 服务 命令 sdeservice o create d oracle orcl p sde i esri sde 2 启动 sde 服务 报错 3 以上1命令在机器上执行不认 用以下命令 sdeservice
  • 【DevOps-监控】生产环境是如何落地一套全方位的监控系统

    生产环境监控究竟需什么样的功能 我们试想一下 如果部署一个监控系统到生产环境 需要满足哪些功能呢 既然是监控 肯定需要监控我们的主机资源信息包括cpu 内存 网络 磁盘等信息吧 其次还得监控容器的相关资源信息 然后我们可能还需要历史数据 几
  • uni-app vuex全局计时

    功能需求 在A页面进入时候开始计时中间会去到B页面查看数据 但是并没有销毁当前页面 所以计时一直在 直到在B页面提交数据 才结束计时 在根文件夹创建 store文件夹 同时创建index js文件 import Vue from vue i
  • TensorFlow:实战Google深度学习框架(二)实现简单神经网络

    3 4 TensorFlow实现神经网络 3 4 1 TensorFlow游乐场 3 4 2 前向传播 3 4 3 神经网络参数与TensorFlow变量 变量和张量的关系 变量的三个属性 张量 维度 类型 3 4 4通过TensorFlo
  • flask-sqlalchemy插件使用

    1 Flask SQLAlchemy插件的使用 该插件对SQLAlchemy进行了简单的封装 使得我们可以更加简单的使用 初始化数据库 无需导入create engine from flask import Flask from flask
  • win10怎么设置WiFi与有线优先级

    原文 https blog csdn net u010921682 article details 88964982 经过测试 文章中第二种方式有效 不过我的优先级与原文中的不同 我是wifi优先于有线 如下 二 修改 接口跃点数 这个名词
  • Android的中http协议HttpURLConnection中post请求

    public class MainActivity extends AppCompatActivity private TextView textView Override protected void onCreate Bundle sa
  • Idea里面关于时间date报错Unhandled exception: java.text.ParseException的解决方案

    我一直报这个错找不到 结果是因为我导包的原因 idea自动导包导出来是这个 但是咱们需要的是这个 就不报错了
  • Lerna包管理

    认识lerna 导读 本章节主要讲解Lerna是什么 Lerna有什么用 如何使用Lerna进行npm包管理 大厂的Lerna版本管理策略是怎么做的 Lerna是如何实现本地包依赖管理以及底层原理是什么 读者可以带着这些问题去阅读 使学习事
  • 利用jni将Eclipse与C++、Opencv无缝连接

    利用jni将Eclipse与C Opencv无缝连接 博主 w风的季节 日期 2018 4 11 现在越来越多的大学生实验室或者创新项目需要用到将JAVA与C 之间的混合编程 因此本篇就来讲解一下Eclipse中用java写的APP如何将C