Articles of android ndk

无法编译Android的LKM

我有Ubuntu 12.04作为编译环境。 我也有Cyanogen mod内核的源代码(从Github获得: https : //github.com/CyanogenMod/cm-kernel ) 我使用Android NDK r5c 工具链 (for linux) 我有以下代码: #include <linux/kernel.h> #include <linux/module.h> #include <asm/unistd.h> asmlinkage ssize_t (*orig_open)(const char *pathname, int flags); asmlinkage ssize_t hooked_open(const char *pathname, int flags) { printk(KERN_INFO "SYS_OPEN: %s\n", pathname); return orig_open(pathname, flags); } void **sys_call_table; static int __init root_start(void) { sys_call_table= (void *) 0x0030084; […]

为Android获取valgrind。 valgrind正在寻找`memcheck-arm-linux`的问题

上下文正在开发一个Android应用程序,通过sh系统调用使用几个静态的可执行文件。 其中一个二进制文件最终在使用三星s4手机(但不使用模拟器或索尼Xperia tipo手机时)segfaults,所以遵循http://embetek.blogspot.com.es/2011/10/valgrind-for-arm .html与几个自定义修改(CFLAGS =' – 静态-march = armv7-a')最终得到一个 $ ldd valgrind not a dynamic executable $ file valgrind valgrind: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for GNU/Linux 3.2.0, not stripped. 加载到目标手机上(versioned android 4.2.2 kernel 3.4 …), (context.getFilesDir() + File.separator + "valgrind").canExecute()返回false。 运行sh -c PATH…valgrind告诉valgrind: can't execute: Permission denied ,状态126退出。 仿真器似乎运行内核2.6 […]

在ubuntu 12.04中,android-ndk-r9d-linux-x86的ndk-gdb出现错误

我在ubuntu 12.04中使用了android-ndk-r9d-linux-x86的ndk-gdb来debuggingandroid原生应用程序“hello-jni”,但是却收到了这个错误。 WARNING: The shell running this script isn't bash. Although we try to avoid bashism in scripts, things can happen. …/adt-bundle-linux-x86-20140321/android-ndk-r9d/ndk-gdb: 143: …/adt-bundle-linux-x86-20140321/android-ndk-r9d/ndk-gdb: Bad substitution …/adt-bundle-linux-x86-20140321/android-ndk-r9d/ndk-gdb: 555: [: 1: unexpected operator …/adt-bundle-linux-x86-20140321/android-ndk-r9d/ndk-gdb: 771: [: armeabi-v7a: unexpected operator 但android-ndk-r8e-linux-x86是好的,我不知道为什么? 谢谢。

用Android NDK r10编译FFmpeg 2.3

我想按照这个教程来编译FFMpeg 2.3和Android NDK r10: http ://www.roman10.net/how-to-build-ffmpeg-for-android/ 得到几个错误后,我修改了这样的构build脚本: #!/bin/bash ###################################################### # Usage: # put this script in top of FFmpeg source tree # ./build_android # It generates binary for following architectures: # ARMv6 # ARMv6+VFP # ARMv7+VFPv3-d16 (Tegra2) # ARMv7+Neon (Cortex-A8) # Customizing: # 1. Feel free to change ./configure parameters for more features # 2. […]

Android上的本地自修改代码

我正在尝试在Android上进行一些自我修改的本地代码,并在模拟器中运行它。 我的示例是基于android-ndk的HelloJNI示例。 它看起来像这样: #define NOPE_LENGTH 4 typedef void (*FUNC) (void); // 00000be4 <nope>: // 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); […]

Android中最重要的POSIXfunction是什么?

我即将把一个大的C ++项目(某种库项目,它绝对不包含GUI)移植到Android上。 它实际上是一个Visual C ++项目,但它将作为中间步骤移植到Linux。 我知道Android不是一个“完整的”Linux,并不是说要提供所有的POSIXfunction,但是我也知道使用NDK在Android上有很多“POSIXishfunction”。 现在我的实际问题是: 与完整的POSIX集相比,Android上最大/最重要的function是哪些? 所以在从Visual C ++移植到Linux GCC时,我可以牢记这一点。 我试图findGoogle上的东西,但没有发现真正有用的东西,只是在这里和那里有一些东西,提到有Android上的一些POSIXfunction…

如何使用su命令通过adb shell?

我需要做一个脚本,在Android设备上执行很多东西,我的设备是扎根的,当我进入shell,我可以给su命令,它的工作原理,但我需要通过这个命令,如: adb shell " su; mv /sdcard/Download/app_test /data/local; cd /data/local; ./app_test; exit; exit; " 当我在su之前写了一些命令的时候,根据我读的su创build了一个立即返回的新shell,但是我需要在su shell上发出命令,我该怎么做?

使用Android NDK编译libpcap

我一直在做很多尝试,以获得Android的libpcap编译,我没有看到任何模式或任何值得写下来的进展。 我有一个非常简单的嗅探器(在MIPS linux中工作正常),使用libpcap,所以我想我自己哦,好的…没有biggie …我只是编译Android的libpcap(到最后,Android是只是一个Linux)…这里是问题开始的地方。 我不知道如何使用ndk-build和Android.mk以及所有的基础结构来编译libpcap。 我有一个目录中的Android NDK。 NDK有工具链(我在~/Documents/Projects/Android_NDK/toolchains/下有很多目录),但是没有一个工具链可以使用libpcap 。 我已经尝试了两个不同的libpcap版本或…分支机构: Android的一个,这是我想要使用的, https://android.googlesource.com/platform/external/libpcap/ 和常规的: http : //www.tcpdump.org/release/libpcap-1.5.3.tar.gz 我所做的所有尝试都是非常不成功的。 我已经看到了Android NDK的问题:链接使用预编译的静态库是相似的,但我仍然收到各种错误。 我已经将这些pcap库下载到他们自己的目录中。 也许是这个问题? 我是否需要将Android libpcap放在NDK根目录下的某个目录中并重新创build工具链? 我在MacOSX 10.9.2 64bit上使用NDK-r9。

如何在Android shell中复制和编辑文件?

Androidshell没有cp命令。 Androidshell也没有sed或grep或vi 。 我没有可用的adb守护进程。 有mv命令,但如果源位于只读设备上,则拒绝工作。 如果我必须recursion地从只读设备复制一些目录,该怎么办? 如何更改文本文件中的一行(例如“PATH = / cache”为“PATH = / mnt / asec”)?

如何展开堆栈以获取指定堆栈指针(SP)的回溯?

我正在为Android编写(仅限ARM),但我相信通用Linux的原理也是一样的。 我试图从信号处理程序捕获堆栈跟踪,以便我的应用程序崩溃时可以logging它。 这就是我使用<unwind.h> 。 初始化: struct sigaction signalhandlerDescriptor; memset(&signalhandlerDescriptor, 0, sizeof(signalhandlerDescriptor)); signalhandlerDescriptor.sa_flags = SA_SIGINFO; signalhandlerDescriptor._u._sa_sigaction = signalHandler; sigaction(SIGSEGV, &signalhandlerDescriptor, 0); 代码本身: struct BacktraceState { void** current; void** end; void* pc; }; inline _Unwind_Reason_Code unwindCallback(struct _Unwind_Context* context, void* arg) { BacktraceState* state = static_cast<BacktraceState*>(arg); state->pc = (void*)_Unwind_GetIP(context); if (state->pc) { if (state->current == state->end) return _URC_END_OF_STACK; […]