从Android Studio 1.3开始,应该可以在声明native方法后立即自动生成JNI存根,而不必使用javah.
这里的例子:
(来自http://ph0b.com/new-android-studio-ndk-support/)
我不能.
我在用 :
plugin: 'com.android.model.application'在app中build.gradle;classpath "com.android.tools.build:gradle-experimental:0.2.1"在项目build.gradle内dependancies的范围;distributionUrl=https\://services.gradle.org/distributions/gradle-2.5-all.zipin gradle-wrapper.properties;Gradle 2.5按照Gradle Experimental的要求使用.我的NDK范围如下:
android.ndk {
moduleName = "MyJNILibrary"
cppFlags += "-std=c++11"
stl = 'gnustl_shared'
}
Run Code Online (Sandbox Code Playgroud)
最后,包含JNI调用的类:
package modules.jni;
public class JniClass {
static {
System.loadLibrary("MyJNILibrary");
}
public static native String getStringFromJNI();
}
Run Code Online (Sandbox Code Playgroud)
而已.我究竟做错了什么 ?
我甚至不能使用javah,因为它在项目src目录中时找不到我的类文件:
"C:\ Program Files\Java\jdk1.8.0_31\bin\javah.exe"-d ./jni-classpath C:\ android-sdk\platforms\android-23\android.jar; ...\build\intermediates\classes\debug modules.jni.JniClass
Error: Could …
java-native-interface android gradle android-ndk android-studio
在 iOS 上,有3 种显示网页内容的方法(一位 iOS 开发者告诉我):
UIWebView显示在 a 内UIControllerView如果我是正确的SFSafariViewController作为一个UIControllerViewSafari,应用程序本身在Android上,就我而言,只有两种方法:
WebView内)FragmentActivityAction.View Intent)。不管怎样,它的优点SFSafariViewController是你的应用程序中有一个功能齐全的网络浏览器,而不会让你的应用程序在整个操作系统上保持恒定的用户体验。
最近,我遇到了 Reddit 或法国铁路应用程序 (OuiSNCF) 等应用程序,其中网页内容的显示方式与 iOS 上的方式非常相似SFSafariViewController:
Activity但是在互联网上和这里查看,我只能找到通过 Intents 启动 Chrome 本身的方法。在寻找时ChromeView我偶然发现了一些项目,但没有任何官方的。
所以我在这里问一个问题:这是否是官方的?真的有类似iOSChromeWebView的吗?SFSafariViewController如果是,如何实施?
感谢您的回答!
我想要一些关于Java的帮助 - Android MultiThreading
在学习以多线程方式开发我的应用程序以利用不断增长的多核设备市场份额(大多数设备现在是四核,有些甚至是octo-core)时,我遇到了我的情况.线程正在调用两次或运行两次.
我只是不知道为什么以及如何.
[编辑3]
好吧,我缩小了问题范围:我AsyncTask从onResume()方法中调用了它.虽然我的应用程序并没有失去焦点(这将意味着一个电话onPause(),然后返回到onResume()在这种情况下我的线程将被运行两次焦点视窗)在测试过程中,我通过调用移动客场解决问题FetchFriendsList到另一个地方.到目前为止一切都那么好,但是因为在我的测试中应用程序没有松散焦点或者它确实没有,但我无法见证它(!),我认为还有另一个原因,所以我说我的问题没有完全解决..至少目前.它确实有效.也许我确实解决了这个问题,但我不知道如何:(
[编辑结束3]
我正在实施最后一个Facebook SDK,我正在使用它来获取最终用户朋友列表,这似乎可以完成这项工作.因为我在AsyncTask中运行此操作,所以我没有使用request.executeAsync().相反,我正在使用request.executeAndWait().Facebook JavaDoc确实声明只有当我不在主UI线程中时才能使用此方法,否则我会得到一个NetworkOnMainThreadException.
无论如何,这是奇怪的行为发生的地方.
private final ArrayList<GraphUser> userFriendsList = new ArrayList<GraphUser>();
public final void fetchFriendsList() {
if (this.session != null && this.session.isOpened()) {
final Request requestUserFriendsList = Request.newMyFriendsRequest(
this.session, new Request.GraphUserListCallback()
public final void onCompleted(final List<GraphUser> users, final Response response) {
if (users != null && users.size() > 0) {
Log.v("Retrieved Friends List -> ", …Run Code Online (Sandbox Code Playgroud) 我正在开发一个使用蓝牙与附近PC通信的Android应用程序.该应用程序在我自己的设备(三星Galaxy Note 3 - CM 12.1)上运行很大,但我的beta测试人员却没有.
简单地说,该应用程序允许人们通过蓝牙和他们的手机从他们的PC(使用我的C#WPF应用程序)编写和接收短信.
我的测试人员正在使用三星Galaxy Note 4库存ROM(Lollipop).
起初我认为当他的屏幕关闭时,Android会杀死MainActivity,它包含一些线程,包括保持连接活动的线程(使用inpustream.read()阻塞方法).这种行为不会发生在我自己的设备上:我可以保持连接一整晚没有插入我的手机.
但是我被警告说,使用服务可以避免这样的问题,因为Android从一个设备到另一个设备的行为方式不同.所以我更新了我的应用程序并使我的MainActivity使用我的MainService来生成相对线程.但它并没有改变一件事.
正如我的标题所示,问题在于他的防病毒软件,更确切地说是AVG.我不知道这样的防病毒如何在Android上工作,我甚至不使用它.通过在他的root Galaxy Note 4上使用Titanium Backup冻结AVG,我的应用程序stopepd崩溃并且现在正如预期的那样完美地工作.
所以我想知道,当设备屏幕关闭时,AVG如何决定杀死我的应用程序?我的应用程序应如何运行,以便任何其他使用AVG或任何其他防病毒软件的用户都不会这样做?我应该怎么做才能让我的应用看起来不像嫌疑人?
我想知道是否有办法调整 JavaFX 的ListView.
您可能会说这是滞后的,因为我的集合太大和/或我CellFactory的太重......只是即使使用少量字符串集合,帧速率似乎也太低......
所以我想知道是否有某个设置或指南可以遵循以实现平滑滚动。
先感谢您
我的问题很简单.我想知道我的应用程序的最佳做法是什么,以便它可以"防止打瞌睡".随着Android N将在更多情况下应用Doze,这变得更加相关.
在阅读Doze文档时,有一部分提到了网络访问:
在打盹模式下,系统会通过限制应用程序访问网络和CPU密集型服务来尝试节省电池电量.它还可以防止应用程序访问网络并延迟其作业,同步和标准警报.
我相信Buetooth属于网络访问,这是正确的吗?
由于我没有使用Marshmallow(或Android N)设备,并且因为Emulator不允许蓝牙交互,所以我无法在打盹模式下测试我的应用行为.
Doze模式会杀死任何正在进行的蓝牙连接吗?这同样适用于Bluetooth Classic和LE吗?带蓝牙A2DP的耳机怎么样?
我的应用必须保持此连接,否则核心功能将被破坏.
当然,对于这样的情况,存在某种例外情况,即用户需要将设备连接到蓝牙远程设备.
我知道存在一个打盹白名单,但在某些情况下,似乎可能不会让应用程序在API 23以下的设备上运行.
谢谢您的帮助!
android bluetooth android-6.0-marshmallow android-doze android-7.0-nougat
我正在开发一个项目,minSdkVersion设置为25(又名 Android 7.1)。
由于这个版本相当高,所以我可以使用很多方法,而不用担心向后兼容性。
例如,drawable从 a检索 a Fragment, 应该如此简单:
context?.getDrawable(R.drawable.my_drawable)
Run Code Online (Sandbox Code Playgroud)
在源码中,它的作用是:
return getResources().getDrawable(id, getTheme());
Run Code Online (Sandbox Code Playgroud)
据我了解,API 21(Android 5.0)中引入了这样的方法。
但是,我收到以下警告:
查看源代码ContextCompat.getDrawable(...):
if (Build.VERSION.SDK_INT >= 21) {
return context.getDrawable(id);
} else if (Build.VERSION.SDK_INT >= 16) {
return context.getResources().getDrawable(id);
} else { ... }
Run Code Online (Sandbox Code Playgroud)
由于min SDK设置为25,第一个if将始终被调用,然后与我编写的代码相同。那么为什么会出现警告呢?
我可以压制它,@SuppressLint("UseCompatLoadingForDrawables")但它有点挫败了目的……或者我可以遵循它……
这是正常的吗?我是否应该真正使用ContextCompat及其附属公司,或者是否有某个设置可以删除此类错误警告?
PS:该项目也使用Android X。
android lint backwards-compatibility android-studio androidx
我刚刚将Android Studio设置更新为1.3(截至2015年8月31日的最新版本),我需要使用最新的NDK集成.我以前的Android Studio版本是1.2.1(稳定).
在Google Migration to Gradle实验指南之后,我设法轻松调整了各种gradle脚本.
但是,Gradle Sync失败并出现以下错误:
Error:No such property: android for class: com.android.build.gradle.managed.ProductFlavor
Run Code Online (Sandbox Code Playgroud)
[更新1 - >见下文,更新错误]
当我尝试Make这个项目时,我得到了一个更详细的错误:
Error:(17, 1) A problem occurred configuring project ':app'.
> Exception thrown while executing model rule: model.android
> No such property: android for class: com.android.build.gradle.managed.ProductFlavor
Run Code Online (Sandbox Code Playgroud)
App指的是主要的应用程序代码(带有活动和其他).
使用该功能F4 > Jumping to Source,它将build.gradle从我的app项目中打开我的脚本.
这是上述脚本的内容:
apply plugin: 'com.android.model.application' // experimental
model {
android {
compileSdkVersion = 21
buildToolsVersion = '22.0.1'
defaultConfig.with {
applicationId = …Run Code Online (Sandbox Code Playgroud) android gradle android-ndk android-studio gradle-experimental
由于我具有特定的自定义单元格ListView,因此很难理解如何删除每个单元格之间(甚至更糟的是,在所述单元格的右侧和左侧)之间存在的“自然”类边距/间距。
这是一个例子:
] 1
如您所见,我使用一种颜色来带出每个单元格。您无法看到单元格末尾的空间(在它们的右侧),因为我需要滚动,但是您可以相信我,每一侧的空格都是相等的(尽管在左侧和右侧更大)。 ),这是不正常的,因为我专门设计了这些单元,使其宽度与相同,ListView因此无需使用水平滚动。我的问题有点打败了我的宗旨...
每个单元由一个带有图像和一个标签的AnchorPane组成。该AnchorPane涂黄色(-fx-background-color: yellow;)。
正如您可以清楚地看到的那样,这些单元周围都存在这些空白。
仅供参考,在这里我使用的是JavaFX 8 / 2.2 SDK,但我打算使用JFoenix JFXListView&JFXListCell。但是,使用这些间隔甚至更糟。
奇怪的一点:我也ListView用绿色画了,但是这种颜色无处。待观察。我猜所有的单元格(以及空的单元格)都会覆盖ListView内容,因此不看背景就很有意义。但是,这意味着细胞以某种方式“损坏”,因为在我的细胞周围“添加了”空白。
我试图将所有内容的填充都设置为0,但没有成功。
最后,在该onUpdateItem方法中,我确实调用了super方法,并且当该单元格未标记为空时,我将图形设置为上述AnchorPane,否则将其设置为null,这与我的屏幕截图非常一致。
谢谢您的帮助 !
假设您正在WorkerThread执行一项长时间运行的任务。但是,为了完成上述长时间运行的任务,您必须从UI Thread.
基本上,我需要访问UI 线程,它将生成一个必须在 UI 线程上初始化但随后可以在任何线程中使用的对象。
我想做的是可能使用协程/挂起函数,其中工作线程实际上等待 UI 线程上的操作完成。
我怎样才能实现这样的目标?谢谢 !
以下代表了我想要实现的目标的架构:
@WorkerThread
fun processTask() {
// ... do some stuff to init work
val something = getSomethingFromUiThread() // wait
// ... resume & complete stuff with "something"
}
@MainThread
suspend fun getSomethingFromUiThread() {
// ... create object on UI Thread
// ... return initialized object to the worker thread
}
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助。