围绕获取原生opencv for android构建有很多问题和答案.有些使用gradle,有些则使用外部工具.对于原生OpenCV构建,这些众多,复杂且经常相互矛盾的描述可能会以一致的起点进行简化; 在创建Android Studio 2.2 Beta项目时,有一种方法可以包含C++支持:


此功能是在2016年6月左右添加的.有关详细信息,请参阅Android工具技术文档.
将Android Studio 2.2或更高版本与Gradle 2.2.0或更高版本的Android插件一起使用,您可以将C和C++代码编译到Gradle可以与您的APK打包的本机库中,从而为您的应用添加C和C++代码.然后,您的Java代码可以通过Java Native Interface(JNI)调用本机库中的函数.如果您想了解有关使用JNI框架的更多信息,请阅读适用于Android的JNI技巧.
检查Include C++ Support生成一个名为的外部构建文件CMakeLists.txt.
# Sets the minimum version of CMake required to build the native
# library. You should either keep the default value or only pass a
# value of 3.4.0 or lower.
cmake_minimum_required(VERSION 3.4.1)
# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# …Run Code Online (Sandbox Code Playgroud) windows java-native-interface cmake android-studio opencv4android
虽然早期版本的OpenCV(即2.4)允许Android项目利用SIFT功能,但将该功能分离opencv_contrib使得任务更加困难; 将OpenCV-3.x.x-android-sdk模块集成到项目中会使您无法使用该SIFT功能.
FeatureDetector.create(FeatureDetector.DYNAMIC_SIFT); // Fails
//OpenCV Error: Bad argument (Specified feature detector type is not supported.)
Run Code Online (Sandbox Code Playgroud)
尽管像Gouhui Wang这样的技术描述了如何将OpenCV的非自由部分构建到Android项目中,但该过程需要外部工具.这个问题是关于如何获得相同的结果,而是利用Android Studio/InteliJ的强大功能和便利性.
现代Android Studio版本具有有用的功能:
使用Android Studio 2.2及更高版本,您可以使用NDK将C和C++代码编译到本机库中,并使用IDE的集成构建系统Gradle将其打包到您的APK中.然后,您的Java代码可以通过Java Native Interface(JNI)调用本机库中的函数
正如这个有关使用C++支持构建OpenCV的stackoverflow问题和答案所示,可以将opencv4android的OpenCV 3.1(我怀疑其他版本)快速集成到新应用程序向导中生成的C++构建结构中.
为了让OpenCV的非自由部分完全在原生Android Studio构建过程中构建,需要采取哪些具体步骤?
有一个桌面应用程序使用Thread.sleep()来实现长(数分钟或数小时)的延迟。从Windows XP(至少)到Windows 7,该应用程序都可以正常工作。该应用程序将计算将来需要执行的操作,然后单击Thread.sleep(msToWait)。即使系统在等待期间碰巧进入了S3睡眠状态,这也可以正常工作。
但是,从Windows 10开始,如果机器位于S3中,则Thread.sleep()之后的代码不会“按时”执行。看来机器开始在“ msToWait”处加上机器进入S3的时间开始执行代码(目前尚不能百分百确定,但有可能)。
Windows的早期版本没有表现出这种现象。不管睡眠状态如何,Thread.sleep()之后的代码都会等待正确的时间。
测试是在当前的JVM 1.7上进行的。
这是Windows 10错误吗?这是JVM错误吗?有解决方法吗?
附加数据:
开发了测试程序和程序。步骤是运行程序,使机器休眠约一分钟,然后唤醒机器并等待程序完成。
如果此程序在JVM版本为25.40-b25的Windows 10(报告为8)上运行,它将失败:
C:\Users\Tester\Downloads>SleepTester.exe
Wed Apr 01 10:47:35 PDT 2015 Using default number of minutes: 5
Wed Apr 01 10:47:35 PDT 2015 You can use "SleepTester -minutes 10" to have it sleep for 10 minutes, for example.
Wed Apr 01 10:47:35 PDT 2015 JVM Version: 25.40-b25 Windows Version: Windows 8
Wed Apr 01 10:47:35 PDT 2015 The program will now wait for 5 minutes. Expect wrap-up at Wed …Run Code Online (Sandbox Code Playgroud) 鉴于许多框架将创建复杂的(可能不那么可读/逻辑)SQL查询,似乎有一个工具可以直观地显示连接是如何完成的,这可能是一个有用的工具.但我还没有找到这样的工具.
我接受了一个包含大量表格的查询,并创建了一个图形作为我认为这种工具输出的示例:

链接上的文本是连接中使用的字段名称.粗体项是查询的输入.以数字结尾的表名只是同一个表的重复实例(即Partner和Partner2是同一个表,只是查询的一部分不止一次).
我希望能够将SQL查询删除到工具中并查看这样的图表.可能?
在这个老问题中,我们建议采取行动不再可用Google Play Developer Console.现在有一个Download链接提供了一个包含以"app_version"结尾的csv的zip文件,但由于我已将beta代码提升为生产版,因此生产版和测试版用户都将运行相同的版本.因此,beta测试人员无法从应用程序的版本中获得.
当测试版用户访问Play商店时,他们会被告知他们是测试版测试人员,并且可以选择退出成为测试版测试人员.
最好的情况是,我想知道如果他们在Play商店中查看,有多少人会得到你是beta测试人员的消息.
android release-management beta-testing google-play google-developers-console
如果相同代码的多个实例在不同的服务器上运行,我想使用数据库来确保如果某个服务器已经在另一台服务器上运行,则它不会在一台服务器上启动.
我可能会提出一些可行的SQL命令,它们使用Oracle事务处理,锁存器或其他任何东西,但我宁愿找到一些经过尝试和真实的东西.
几年前,作为SQL wiz的开发人员有一个SQL事务,它获取了信号量,如果得到它则返回true,如果没有得到它则返回false.然后在我处理结束时,我需要运行另一个SQL事务来释放信号量.这很酷,但我不知道数据库支持的信号量是否有可能超时.超时是一个巨大的好处!
编辑:
以下是一些可行的SQL命令,但除了通过cron job hack之外没有超时:
---------------------------------------------------------------------
--Setup
---------------------------------------------------------------------
CREATE TABLE "JOB_LOCKER" ( "JOB_NAME" VARCHAR2(128 BYTE), "LOCKED" VARCHAR2(1 BYTE), "UPDATE_TIME" TIMESTAMP (6) );
CREATE UNIQUE INDEX "JOB_LOCKER_PK" ON "JOB_LOCKER" ("JOB_NAME") ;
ALTER TABLE "JOB_LOCKER" ADD CONSTRAINT "JOB_LOCKER_PK" PRIMARY KEY ("JOB_NAME");
ALTER TABLE "JOB_LOCKER" MODIFY ("JOB_NAME" NOT NULL ENABLE);
ALTER TABLE "JOB_LOCKER" MODIFY ("LOCKED" NOT NULL ENABLE);
insert into job_locker (job_name, locked) values ('myjob','N');
commit;
---------------------------------------------------------------------
--Execute at the beginning of the job
--AUTOCOMMIT MUST BE OFF!
---------------------------------------------------------------------
select …Run Code Online (Sandbox Code Playgroud) 我希望我的应用能够从预定义的共享公共Google云端硬盘文件夹中读取,而无需用户登录或选择Google帐户.
使用我的桌面浏览器,我在Google云端硬盘上创建了一个公共文件夹,该文件夹设置为公开.有链接的任何人都可以访问(读取)驱动器,因此无需授权:
在我的Android Studio项目中,我已经进入File > Project Structure > Dependencies并添加了com.google.android.gms:play-services-drive:10.2.0
我现在有能力创建一个new GoogleApiClient.Builder().
我查看了各种示例,但在大多数情况下,驱动程序是由Android应用程序创建的.这不是我想要管理的情况.
此问题是关于访问已使用"文件夹ID"公开的驱动器,或者0B6X74x23H....在最初共享和公开文件夹时分配的任何内容.
我已经检查了Google提供的演示代码,但据推测,这不是公共文件夹,因为它说:
...需要注册OAuth 2.0客户端
至少,我可以使用http-client来驱动这个过程,在https://drive.google.com/drive/folders/0B6X74x23Hx7DNE13M0ZIbVI....?usp=sharing没有身份验证的情况下进入共享链接,而不需要跳过箍.但是,当然使用已定义的API并简单地指定公共共享文件夹以列出内容并且如果需要,从公共文件夹下载文件将更加清晰.
当我尝试这段代码时:
Scope publicFolder = new Scope(EXISTING_FOLDER_ID);
mGoogleApiClient = new GoogleApiClient.Builder(mActivity)
.addApi(Drive.API)
.addScope(publicFolder)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
mGoogleApiClient.connect();
Run Code Online (Sandbox Code Playgroud)
这种方法触发:
GoogleApiClient.OnConnectionFailedListener.onConnectionFailed()
结果包含statusCode=SIGN_IN_REQUIRED.但当然,对于公开的文件夹,不需要登录.
android public-folders google-api-client google-drive-api google-drive-android-api
如何将我在应用商店中的应用更新到较新版本?
早些时候,我成功地将我的应用程序提供给了应用程序商店。这就是起点。但是已经有一段时间了,我更新了我的应用程序,并想提供一个新版本。由于准备应用程序的失误可能需要一些时间,因此我想了解在 Apple 应用程序商店中提供更新版本所需的具体步骤。
我已将以下内容添加到dependencies我的应用程序的一部分build.gradle
implementation 'org.seleniumhq.selenium:selenium-htmlunit-driver:3.56.0'
但我收到错误:
Could not find org.seleniumhq.selenium:selenium-htmlunit-driver:3.56.0.
Searched in the following locations:
- https://dl.google.com/dl/android/maven2/org/seleniumhq/selenium/selenium-htmlunit-driver/3.56.0/selenium-htmlunit-driver-3.56.0.pom
- https://repo.maven.apache.org/maven2/org/seleniumhq/selenium/selenium-htmlunit-driver/3.56.0/selenium-htmlunit-driver-3.56.0.pom
- https://jcenter.bintray.com/org/seleniumhq/selenium/selenium-htmlunit-driver/3.56.0/selenium-htmlunit-driver-3.56.0.pom
Required by:
project :app
Run Code Online (Sandbox Code Playgroud)
因此,在项目build.gradle文件中,我添加了以下repositories部分:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
// ADDED THIS 2021 12 17
maven {
url("https://mvnrepository.com")
}
mavenCentral()
}
dependencies {
classpath "com.android.tools.build:gradle:7.0.3"
}
}
Run Code Online (Sandbox Code Playgroud)
我认为这会起作用,因为当我使用浏览器导航到该域时,有一个包含selenium-htmlunit_driver_3.56.0mvnrepository.com的页面。
我期望的是会找到指定的依赖项。或者,我会得到一份报告,其中包含“在以下位置搜索:”下的另一行,但将该 Maven 行添加到项目 build.grade 中没有效果。
我需要做什么才能搜索到额外的 Maven 存储库?从条目(repo.maven.apache.org/maven2...)拉入的maven存储库 …
我有一个像这样的JSP页面:
<html><body>
<div id="mainContainer">
<div id="firstDisplayStuff">...</div>
<% out.flush(); %>
<div id="slowStuff">
<mytaglib:abc name='SlowBoat'>...</mytaglib>
</div>
</div>
<div id="floatRightContainer>
<div id="endingDisplayStuff">...</div>
<div>
</body></html>
Run Code Online (Sandbox Code Playgroud)
当它到达taglib时,它需要永远,并且无法避免这种延迟.
所以使用out.flush();我至少可以显示firstDisplayStuff,但是当taglib的东西运行时,用户只是坐在那里看半页.只有在完成之后,用户才会看到endingDisplayStuff.
我希望firstDisplayStuff并endingDisplayStuff立即显示.
但我认为使用jQuery会有一种方法可以<div id="slowStuff">留空,然后再加载它.
<div id="slowStuff">在两个显示东西div显示后,jQuery代码会加载什么?我会把代码放在哪里?怎么会被调用?
编辑:添加<div id=mainContainer>并<div id=floatRightContainer>进入现有示例.
android ×2
cmake ×2
sql ×2
windows ×2
ajax ×1
beta-testing ×1
build ×1
dependencies ×1
google-play ×1
ios ×1
java ×1
javascript ×1
jquery ×1
jsp ×1
locking ×1
maven ×1
opencv ×1
oracle ×1
semaphore ×1
sleep-mode ×1
taglib ×1
transactions ×1
windows-10 ×1
windows-8 ×1
xcode ×1