JNI本机代码中的分段错误(Android)

时间:2015-07-21 11:36:16

标签: android haskell android-ndk java-native-interface cross-compiling

我在Haskell中有一个库,我已经为via FFI和Swig生成了包装器。我还设法交叉编译了一个可以从Java加载的共享库。包装库包含一些函数和输入/输出类型。

在我的Arch机器上,我可以使用Java中的库。但是,当我现在在Android上试用它时,就会出现段错误。经过一些调查,似乎如果输入对象没有字段,它有时会起作用。我认为这是数据编组的问题。然而,调试起来很困难。在崩溃日志中我找到了这个

W/linker  ( 4783): libAPIsJava.so has text relocations. This is wasting memory and prevents security hardening. Please fix.

和这个

--------- beginning of crash
F/libc    ( 4783): Fatal signal 11 (SIGSEGV), code 1, fault addr 0x200019 in tid 4783 (api.flic.io.api)
I/Icing   ( 1689): Indexing 17F83E8EEF17AFFA030207AF16B79084CE236092 from com.google.android.googlequicksearchbox
I/DEBUG   (  357): *** *** *** *** *** *** *** *** *** *** *** *** ***     *** *** ***
I/DEBUG   (  357): Build fingerprint:     'google/shamu/shamu:5.1/LMY47D/1743759:user/release-keys'
I/DEBUG   (  357): Revision: '33696'
I/DEBUG   (  357): ABI: 'arm'
I/DEBUG   (  357): pid: 4783, tid: 4783, name: api.flic.io.api  >>> app.api.flic.io.api <<<
I/DEBUG   (  357): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x200019
I/DEBUG   (  357):     r0 af2033d4  r1 af2033d0  r2 00000000  r3 00200018
I/DEBUG   (  357):     r4 a2bbf950  r5 af2033dc  r6 af2029a0  r7 af202fff
I/DEBUG   (  357):     r8 a2af06b0  r9 00200019  sl af2033c8  fp af2030a4
I/DEBUG   (  357):     ip b6e627dc  sp bec8eee0  lr af2029b0  pc a0b4d248  cpsr 800d0010
I/DEBUG   (  357): 
I/DEBUG   (  357): backtrace:
I/DEBUG   (  357):     #00 pc 01be4248  /data/app/app.api.flic.io.api-2/lib/arm/libAPIsJava.so

然而,发布arm-linux-androideabi-addr2line -f -e libAPIsJava.so 01be4248,输出是

$a
/tmp/ghc27404_0/ghc27404_3.bc:? 

哪个帮助不大。我真正想要的是用valgrind运行应用程序,这样可能吗?

更新:我现在已经安装了valgrind并尝试运行该应用程序。但是我得到了

valgrind: mmap(0x108000, 42770432) failed in UME with error 22 (Invalid argument).
valgrind: this can be caused by executables with very large text, data or bss segments.

这似乎是不行的。

1 个答案:

答案 0 :(得分:2)

原来问题是我的交叉编译工具链(https://github.com/neurocyte/ghc-android)在其hsc2hs脚本中有一个错误。它实现为一个包装器,用一些标志调用/ usr / bin / hsc2hs。但是,它没有使用--cc和--ld标志,因此生成的.hs文件以我的构建主机为目标。通过添加这些标志,一切都很棒!