Articles of android ndk

在100%C ++环境下为Android编程?

我一直在为我未来的游戏开发C ++游戏引擎运行时环境,并开始将android视为一个平台。 我注意到它与Java紧密绑定并大量使用Java VM。 但是否可以在Android NDK中维持完整的C ++运行时环境? 我没有反对Java,如果必须的话,我准备使用它,但性能是我最关心的问题之一(我打算让我的游戏占用大量资源),特别是在手机上。 如果可以使用完整的C ++环境,我将如何在Eclipse Indigo CDT中实现它? 我是否能够提前为Android创建已编译的游戏可执行文件以获得最佳性能? 我是否需要在Eclipse中安装任何其他插件? 我可以使用MinGW来编译我的游戏,还是需要使用不同的编译器? 如果我不得不以某种方式使用Java,那么甚至需要编译C ++代码吗? 这些都是我想要回答的问题,以便在Eclipse IDE中获得稳定的开发环境。 请知道我对Android开发和一般的多平台编程仍然相当新。 我的目标是创建一个能够充分利用新硬件的游戏引擎,特别是在手机上! 感谢您提出的任何建议!

如何在Android Studio中添加.so,.mk和其他原生文件?

我要在Android Studio的Project中添加原生文件.so,.mk,.sh,.cpp 。 在eclipse中.so文件被添加到libs文件夹和jni和obj文件夹中的其他文件中,并且一切正常。 但是在Android工作室中我已经在jniLibs文件夹中添加了.so文件,并在.gradle文件中进行了如下更改 ndk{ abiFilters ‘armeabi’, ‘armeabi-v7a’, ‘x86’ } sourceSets.main { jniLibs.srcDir ‘src/main/libs’ //set libs as .so’s location instead of jniLibs jni.srcDirs = [] //disable automatic ndk-build call with auto-generated Android.mk } 下面是我的项目结构和我需要添加的文件。 有jni和obj文件夹包含本机代码,我将使用它。 我已经看到可用的链接,但它们已经过时,没有任何效果。 任何帮助表示赞赏。 执行以下更改后记录: sourceSets.main { jniLibs.srcDir ‘src/main/libs’ //set libs as .so’s location instead of jniLibs jni.srcDirs = [] //disable […]

Android上的原生自修改代码

我试图在Android上制作一些自我修改的本机代码并在模拟器中运行它。 我的示例基于android-ndk中的HelloJNI示例。 它看起来像这样: #define NOPE_LENGTH 4 typedef void (*FUNC) (void); // 00000be4 : // be4: 46c0 nop (mov r8, r8) // be6: 4770 bx lr void nope(void) { __asm__ __volatile__ (“nop”); } void execute(void){ void *code = mmap(NULL, NOPE_LENGTH, PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (code != MAP_FAILED) { memcpy(code, nope, NOPE_LENGTH); […]

非root用户设备上的Android用户空间文件系统驱动程序?

我是否可以编写可以通过标准可用实用程序在非root工厂设备上运行的自定义用户空间文件系统? 我知道fuse-android的存在,但据我所知,它需要一个root设备。 如果不是这样,请纠正我。 我想要实现的目标是创建一个实际安装到文件的“假”FS。

Android std和stl支持

我正在玩android ndk。 我正在使用带有cygwin的Window Vista(最新版本)。 我在手机上编译并发布了hello world jni示例。 这是工作。 代码是(是一个.cpp文件): #include #include extern “C” { JNIEXPORT jstring JNICALL Java_org_android_helloworld_HelloworldActivity_invokeNativeFunction(JNIEnv* env, jobject javaThis); }; jstring Java_org_android_helloworld_HelloworldActivity_invokeNativeFunction(JNIEnv* env, jobject javaThis) { return env->NewStringUTF(“Hello from native code!”); } 我想添加一些修改,只是为了稍微玩一下: #include 然后,在上面的函数中,我补充说: int a; a=std::min(10, 5); 但是编译器说它找不到文件’algorithm’并且min()不是std的一部分。 经过一番搜索,我发现android ndk有一个gnu-libstdc ++目录,里面有所有需要的std文件。 阅读NDK文档,我已经了解到usint std :: *应该可以在不对代码进行任何修改的情况下工作(如果包含正确的头文件)。 但似乎gg on cygwin无法find所需的文件。 为了能够在android ndk应用程序中的.cpp文件中使用std和stl,有哪些步骤?

Android NDK UnsatisfiedLinkError – 一个令人惊讶的原因

更新2013年8月7日:问题现在已经解决,但错误的原因是非常意外的,这些错误的所有常见嫌疑人在开始时都被淘汰了,而且我学到了一些新东西。 请参阅下面的答案。 我在这里非常绝望。 有一个带有本机库的Android应用程序,我称之为方法。 在我测试的所有系统上都没有问题,并且该程序已经在Google Play中没有任何问题报告,成千上万的用户使用。 现在,显然HTC One手机的新ROM – Android版本4.2.2已经淘汰。 用户声称它是官方版本,从官方频道升级。 当他们尝试启动我的应用程序时,它崩溃了,堆栈跟踪说: java.lang.UnsatisfiedLinkError:找不到本机方法… 我知道的方法名称就在那里,并且当他们安装了Android 4.1时,在同一台设备上工作得很好。 我在Android 4.2.2中在模拟器中测试它(没有这个特定的设备)并且没有问题。 此外,用户尝试卸载并重新安装具有相同结果的应用程序。 即使向他们发送私有版本,没有任何ProGuard / Dexguard保护也无济于事。 还有什么可以导致Android上的java.lang.UnsatisfiedLinkError? 或者我应该假设这个HTC ROM只是错误??? 有没有其他人在使用Android 4.2.2的HTC One上遇到过类似的问题? 编辑2013年7月24日 在下面的评论中,另一位开发人员表示系统可能在查找我的本机库时遇到麻烦。 我通过从设置中完全删除本机库文件来试验Genymotion 4.2.2模拟器。 在这种情况下错误信息是不同的,得到: W / System.err:引起:java.lang.UnsatisfiedLinkError:无法从loader dalvik.system.PathClassLoader加载cld [dexPath = / data / app / com.hyperionics.avar-2.apk,libra ryPath = / data / app-lib / com.hyperionics.avar-2]:findLibrary返回null 在我从HTC One用户使用Android 4.2.2获得的堆栈跟踪消息中,我看到以下错误消息: […]

Android Crashlytics ndk; build.gradle中NdkOut和NdkLibsOut的值

我已将Crashlytics, Fabric集成到我的应用程序中,成功报告了与sdk相关的崩溃。 对于ndk部分,我已按照博客的说明进行操作; 等待结束:为Android NDK启动Crashlytics ,但没有报告ndk崩溃。 我的疑问是,因为其他部分足够清楚,我没有为androidNdkOut和androidNdkLibsOut提供正确的路径,如下所示: 疑问和问题在我的build.gradle ,在这里…… crashlytics { enableNdk true androidNdkOut //what would be the obj here? androidNdkLibsOut ‘src/main/jniLibs’ //path for my jni libraries } 如果我要发布代码的任何其他部分,请告诉我

为什么gcc发送代码与ARM指令集的2字节边界对齐?

我正在使用GCC(Android NDK中包含的版本)检查我正在为ARM Android平台编译的C程序的汇编语言输出。 我指定的ARM指令集长度为4个字节而不是THUMB,但令人惊讶的是,emmited汇编语言代码将函数与2字节边界对齐! 以下是生成的代码示例,显示了错误的.align指令: .Ltext0: .global __aeabi_dmul .global __aeabi_d2iz .section .text.InitializeFIRFilter,”ax”,%progbits .align 2 .global InitializeFIRFilter .type InitializeFIRFilter, %function InitializeFIRFilter: .fnstart 根据这个文件 ,正确的对齐应该是4,这是有道理的。 我试图通过使用-falign-functions = 4来强制对齐,但它被忽略了。 以下是我在Android.mk文件中指定的构建标志 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_ARM_MODE := arm LOCAL_MODULE := nativeJadeMobile LOCAL_SRC_FILES := nativeJadeMobile.c fftasm.s LOCAL_LDLIBS := -llog LOCAL_CFLAGS += -marm -ffast-math -O2 -march=armv6 -falign-functions=4 -save-temps -S […]

错误:在PATH中找不到程序“/ndk-build.cmd”

我在Mac OS X(10.8.4)上遇到了以下这个问题,并且自10天以来eclipse JUNO并没有在网上find任何工作。 我已经下载并解压缩了Android NDK。 之后,我在首选项菜单中的“Android”选项中设置了NDK位置。 我想在android ADT上运行一个示例opencv代码( https://www.dropbox.com/s/6s3qwkon9v67u5z/tutorial-3-native.rar )。 在构建时,它提供以下控制台输出 **** Build of configuration Default for project OpenCV Sample – native-activity **** “/ndk-build” Cannot run program “”/ndk-build””: Unknown reason Error: Program “”/ndk-build”” is not found in PATH PATH=[/usr/bin:/bin:/usr/sbin:/sbin] **** Build Finished **** 我对PATHvariables/环境variables一无所知。 请提供一步一步的程序来纠正上述错误。

Android JNI函数在主线程上运行?

我对从Android制作的JNI函数调用有疑问。 它们是否与Android应用程序在同一个线程上运行? 如果本机函数需要更多时间运行,UI是否会冻结?