Questions tagged «android-ndk»

Android本机开发工具包(NDK)是Android SDK的配套工具,可用于以本机代码构建应用程序的性能关键部分,或将C / C ++中的现有库移植到Android。当使用C / C ++编程时,它提供了标头和库,这些标头和库允许构建活动,处理用户输入,使用硬件传感器,访问应用程序资源等。

1
如何影响Android / ARM目标的Delphi XEx代码生成?
更新2017-05-17。我不再为产生此问题的公司工作,也无法访问Delphi XEx。在我在那里的时候,通过迁移到混合FPC + GCC(Pascal + C)来解决问题,对于某些例程,NEON内在函数有所作为。(强烈建议使用FPC + GCC,因为它可以使用标准工具,尤其是Valgrind。)如果有人可以通过可靠的示例演示他们实际上如何从Delphi XEx生成优化的ARM代码,我很乐意接受答案。 Embarcadero的Delphi编译器使用LLVM后端为Android设备生成本机ARM代码。我有大量Pascal代码,需要将这些代码编译到Android应用程序中,并且我想知道如何使Delphi生成更有效的代码。现在,我什至没有在谈论诸如自动SIMD优化之类的高级功能,而只是在生成合理的代码。当然必须有一种方法可以将参数传递给LLVM端,否则会影响结果?通常,任何编译器都会有很多选择来影响代码的编译和优化,但是Delphi的ARM目标似乎仅仅是“优化开/关”,仅此而已。 LLVM应该能够生成合理的紧致和明智的代码,但是Delphi似乎在以奇怪的方式使用其功能。Delphi希望非常大量地使用堆栈,并且通常只将处理器的寄存器r0-r3用作临时变量。也许最疯狂的是,它似乎正在将正常的32位整数作为四个1字节的加载操作进行加载。如何使Delphi产生更好的ARM代码,而又没有它为Android带来的逐字节麻烦呢? 起初,我认为逐字节加载是为了交换big-endian的字节顺序,但事实并非如此,它实际上只是加载具有4个单字节加载的32位数字。*可能是加载完整的32位,而不会产生未对齐的字大小的存储器负载。(是否应该避免那是另一回事,这暗示整个事情都是编译器错误)* 让我们看一下这个简单的函数: function ReadInteger(APInteger : PInteger) : Integer; begin Result := APInteger^; end; 即使启用了优化,带有更新包1的Delphi XE7以及XE6也会为该功能生成以下ARM汇编代码: Disassembly of section .text._ZN16Uarmcodetestform11ReadIntegerEPi: 00000000 <_ZN16Uarmcodetestform11ReadIntegerEPi>: 0: b580 push {r7, lr} 2: 466f mov r7, sp 4: b083 sub sp, #12 6: 9002 str …

23
Android致命信号11(SIGSEGV)位于0x636f7d89(代码= 1)。如何找到它?
我一直在阅读其他文章,以追踪SIGSEGV在Android应用程序中获取的原因。我计划在我的应用程序中搜索与Canvas使用相关的可能的NullPointers,但我SIGSEGV每次都会使用不同的内存地址。另外我看过code=1和code=2。如果内存地址是0x00000000,那么我就知道它是NullPointer。 我得到的最后一个是code=2: A/libc(4969): Fatal signal 11 (SIGSEGV) at 0x42a637d9 (code=2) 关于如何追踪这个的任何建议? 我有一个嫌疑犯,但是我还不愿意尝试它。我的应用程序使用OSMDroid API进行离线映射。OverlayItem类表示地图上的标记/节点。我有一个服务,可通过网络收集数据以填充OverlayItem,然后将其显示在地图上。为了简化设计,我将OverlayItem扩展到我自己的NodeOverlayItem类中,该类包括我在UI Activity和Service中使用的一些附加属性。这给了我关于UI和服务的单点信息。当发生更改时,我使用Intents广播到Activity来刷新UI映射。活动绑定到服务,并且有一个Service方法来获取NodeOverlayItem的列表。我认为这可能是OSMDroid API对OverlayItem的使用,和我的服务同时更新节点信息。(并发问题) 在我撰写本文时,我认为这确实是问题所在。令人头疼的不是将Node和OverlayItem从NodeOverlayItem中分离出来,而是因为Activity需要来自Node的一些数据,而该数据是服务所拥有的。另外,当创建活动(onResume等)时,需要根据活动不在时服务一直在维护的Node数据重新创建OverlayItem对象。例如,您启动应用程序,服务会收集数据,UI会显示它,您转到首页,然后回到应用程序,活动将需要从最新的服务节点数据中提取并重新创建OverlayItem。 我知道这不是一个很好的或明确的问题。就像我所有的SO问题都是利基或晦涩的。如果有人对如何解释这些SIGSEGV错误有任何建议,将不胜感激! 更新 这是在调试会话期间捕获的最新崩溃。我有3个这样的设备用于测试,在我进行开发和测试时,它们并不会全部崩溃。我添加了一些额外内容,以便可以记录GC日志记录。您可以看到该问题可能与内存耗尽无关。 03-03 02:02:38.328: I/CommService(7477): Received packet from: 192.168.1.102 03-03 02:02:38.328: I/CommService(7477): Already processed this packet. It's a re-broadcast from another node, or from myself. It's not a repeat broadcast though. 03-03 02:02:38.406: …

30
错误:在NBI工具链文件夹中找不到前缀为llvm的ABI的工具链
我想使用gradel(gradlew clean build)编译一个开源android项目(Netguard ),但遇到此错误: A problem occurred configuring project ':app'. > Exception thrown while executing model rule: NdkComponentModelPlugin.Rules#cre ateToolchains > No toolchains found in the NDK toolchains folder for ABI with prefix: llvm 我进行了搜索,但是没有找到任何帮助。这是主要的build.gradle: buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle-experimental:0.6.0-alpha1' } } allprojects { repositories { …


23
Android Studio,Gradle和NDK
我对整个gradle和Android Studio支持都是新手。我设法使用export选项将我的android项目转换为gradle。 但是我正在寻找一些文档或起点,以了解如何将NDK构建集成到gradle构建过程中。 如果可能的话,我还需要某种“之后”阶段,将构建二进制文件(.so文件)复制到资产目录。

3
为什么要在armeabi代码上使用armeabi-v7a代码?
在我当前的项目中,我使用了多个.so文件。它们位于armeabi和armeabi-v7a文件夹中。不幸的是.so文件之一是6MB,我需要减小文件大小。我不想使用胖的APK文件,而是只使用armeabi文件并删除armeabi-v7a文件夹。 根据NDK文档,armeabi-v7a代码是扩展的armeabi代码,其中可以包含额外的CPU指令。所有这些都超出了我的专业知识,但是我质疑为什么要同时拥有armeabi-v7a和armeabi代码。一定要有一个很好的理由,对吗? 在我的测试设备上,这一切似乎都可以正常工作。这些具有ARM v7 CPU。可以安全地假设现在一切正常吗?

30
java.lang.ClassNotFoundException:在路径dexpathlist上找不到类
我目前正在一个项目中,我必须使用纯本地ndk。当我尝试从Irrlicht引擎源运行helloworld示例时,它起作用了。然后,按照该示例的相同格式尝试在我的项目中使用它。但是我得到了: 03-14 01:40:05.308: E/AndroidRuntime(799): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.irrlicht.example1/android.app.POMActivity}: java.lang.ClassNotFoundException: Didn't find class "android.app.POMActivity" on path: DexPathList[[zip file "/data/app/com.irrlicht.example1-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.irrlicht.example1-2, /system/lib]] 在运行我的项目时。 这是我的main.cpp文件: #include <android/log.h> #include <jni.h> #include <android_native_app_glue.h> #include "android_tools.h" #ifdef _IRR_ANDROID_PLATFORM_ void android_main(android_app* app) { __android_log_print(4 , "pom" , "nothing"); } #万一 在Android.mk中: LOCAL_PATH := $(call my-dir)/.. IRRLICHT_PROJECT_PATH …
139 java  android  c++  android-ndk 


15
未定义对__android_log_print的引用
我的make文件怎么了? Android.mk LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := foo LOCAL_SRC_FILES := foo.c LOCAL_EXPORT_LDLIBS := -llog include $(BUILD_SHARED_LIBRARY) foo.c #include <string.h> #include <jni.h> #include <android/log.h> #define LOG_TAG "foo" #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__) void test() { LOGI("test"); } ndk构建 foo.c:9: undefined reference to `__android_log_print'

5
在Android上运行Node.Js
所以我知道这已经受到了很多质疑。确切地说,例如这些问题: 在Android中运行NodeJs服务器 如何在Android上运行我的node.js项目? 和 IOS / Android上的NodeJS 提出的每个选项都有一个问题: 我想在普通设备上运行它,所以我希望避免在设备上安装其他操作系统 上个月停止了对JXCore的工作,并且(可能是结果)我无法对其进行编译(请参见无法安装jxcore-cordova) 自2014年以来就没有开发过NodeJs Anode的Android Port,而且当时并没有真正维护它 我链接到的第二个线程中的第二个答案现在提到的是Android的官方节点分发,但是除了指向最新dist的Browse-Web站点的链接之外,我找不到任何有关如何实际使用它的信息。 我也看到了这一点,但似乎设备必须连接到PC(或类似设备)才能运行adb shell命令,而我想将其作为单独的App 自从发布这些问题以来,到现在已经过去了,并且作为“最佳选择”,JXCore现在似乎不可用: 是否可以在Android设备上运行node.js应用程序(在我的情况下为服务器)? 如果您想知道为什么要这样做:我用Node.Js服务器制作了一个WebApp,现在我想要一个可以从手机本地启动而无需Internet连接的版本。这意味着服务器需要在Android手机上运行。

4
如何在Android上的JNI下捕获SIGSEGV(分段错误)并获得堆栈跟踪?
我正在将一个项目移到新的Android Native Development Kit(即JNI)上,我想抓住SIGSEGV(如果它发生的话(可能还有SIGILL,SIGABRT,SIGFPE)),以便呈现一个不错的崩溃报告对话框,而不是(或之前)当前发生的情况:该进程立即异常死亡,并且操作系统可能会尝试重新启动它。(编辑: JVM / Dalvik VM捕获信号并记录堆栈跟踪和其他有用的信息;我只想向用户提供将这些信息通过电子邮件发送给我的选项。) 情况是:我没有编写大量的C代码,完成了该应用程序中的大部分工作(所有游戏逻辑),尽管在许多其他平台上都经过了充分的测试,但我在Android中完全有可能端口,将其作为垃圾进行处理并在本机代码中导致崩溃,因此我希望当前显示在Android日志中的崩溃转储(本机和Java)(我猜在非Android情况下将是stderr)。我可以随意修改C和Java代码,尽管回调(传入和传出JNI)的数量大约为40,显然,小差异的加分。 我听说过J2SE,libjsig.so中的信号链库,并且如果我可以在Android上安全地安装类似的信号处理程序,那将解决我的问题中的棘手部分,但是我没有看到这样的Android / Dalvik库。

2
在Android中从C ++调用Java方法
我试图从C ++获得一个简单的Java方法调用,而Java调用本机方法。这是Java代码: public class MainActivity extends Activity { private static String LIB_NAME = "name"; static { System.loadLibrary(LIB_NAME); } /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView tv = (TextView) findViewById(R.id.textview); tv.setText(this.getJniString()); } public void messageMe(String text) { System.out.println(text); } public …

3
什么导致信号“ SIGILL”?
我正在使用NDK和GCC将一些C ++代码移植到Android。该代码基本上可以运行。一方面,在Eclipse中进行调试时,调用 Dabbler::Android::Factory* pFactory = new Dabbler::Android::Factory; 导致此错误: Thread [1] (Suspended: Signal 'SIGILL' received. Description: Illegal instruction.) 1 <symbol is not available> 0x812feb44 那是什么意思?编译器是否由于某种原因生成了非法代码?我在构造函数中有一个断点(不执行任何操作),并且没有命中。我已经完成了完整的重建。 我会做错什么导致此问题?

12
在我的情况下,System.loadLibrary(…)找不到本机库
我想使用另一个 Android项目中的现有本机库,因此我只是将NDK构建的库(libcalculate.so)复制到我的新Android项目中。在我的新Android项目中,我创建了一个文件夹libs/armeabi/,并将libcalculate.so放在此处。有没有 JNI /文件夹。我的测试设备具有ARM体系结构。 在我的Java代码中,我通过以下方式加载库: static{ System.loadLibrary("calculate"); } 当我运行新的android项目时,出现错误: java.lang.UnsatisfiedLinkError: ... nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "libcalculate.so" 因此,正如错误所述,复制的本机库不在/ verdor / lib或/ system / lib中,在我的情况下如何解决此问题? (我将apk包解压缩,在lib /下有libcalculate.so) ====更新===== 我还尝试在项目根目录下创建一个jni /文件夹,并在jni /下添加一个Android.mk文件。Android.mk的内容为: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libcalculate LOCAL_SRC_FILES := libcalculate.so include $(PREBUILT_SHARED_LIBRARY) 然后,在项目根目录下,我执行了ndk-build。此后,ndk-build生成armeabi /和armeabi-v7a /目录(文件夹中有libcalculate.so)。 然后,我运行maven成功构建项目。在最终的apk软件包中,有: lib/armeabi/libcalculate.so lib/armeabi-v7a/libcalculate.so 但是,当我运行我的应用程序时,会抛出相同的错误: …

4
将Android Studio更新到1.3.0版后,出现“当前插件不赞成NDK集成”错误
3天之前,我已经将Android Studio更新至1.3.0版。 在此之前,我可以使用NDK,而现在却出现类似的错误, 错误:(50,0)错误:当前插件不建议使用NDK集成。考虑尝试使用新的实验性插件。有关详细信息,请参见http://tools.android.com/tech-docs/new-build-system/gradle-experimental。在gradle.properties中将“ android.useDeprecatedNdk = true”设置为继续使用当前的NDK集成。 我在项目级别找不到文件gradle.property。 我该如何解决这个错误?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.