【问题标题】:hello world jni using ARM code使用 ARM 代码的你好世界 jni
【发布时间】:2013-10-28 11:52:55
【问题描述】:

我尝试使用来自 Android 的 ARM 代码,使用 JNI。下载完所有内容(NDK、工具链)后,我打开了名为 hello-jni 的示例 NDK 项目。构建后,它运行良好。现在我尝试使用一些 ARM。 我找到了一个 hello-world ARM 示例:

.align  2
.global armFunction
.type   armFunction, %function

armFunction:
    stmfd   sp!, {fp,ip,lr}
    mov r3, r0, asl #3
    add r0, r3, r0, asl #1
    ldmfd   sp!, {fp,ip,lr}
    bx  lr
    .size   armFunction, .-armFunction

我修改了C源代码,添加了一个函数:

 jint
 Java_com_example_hellojni_HelloJni_factorialJNI(
 JNIEnv* env, jobject object, jint input) {
 return armFunction(input);
 }

我也修改了 Android.mk 文件:

LOCAL_SRC_FILES := hello-jni.c multiple.S

之后,我使用 ndk-build 构建本机代码, 我有一个错误:

c:\android\hello-jni\ndk-build
Gdbserver      : [arm-linux-androideabi-4.6] libs/armeabi-v7a/gdbserver
Gdbsetup       : libs/armeabi-v7a/gdb.setup
Gdbserver      : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver
Gdbsetup       : libs/armeabi/gdb.setup
Gdbserver      : [x86-4.6] libs/x86/gdbserver
Gdbsetup       : libs/x86/gdb.setup
Gdbserver      : [mipsel-linux-android-4.6] libs/mips/gdbserver
Gdbsetup       : libs/mips/gdb.setup
"Compile arm  : hello-jni <= hello-jni.c
"Compile arm  : hello-jni <= multiple.S
SharedLibrary  : libhello-jni.so
Install        : libhello-jni.so => libs/armeabi-v7a/libhello-jni.so
"Compile arm  : hello-jni <= hello-jni.c
"Compile arm  : hello-jni <= multiple.S
SharedLibrary  : libhello-jni.so
Install        : libhello-jni.so => libs/armeabi/libhello-jni.so
"Compile x86  : hello-jni <= hello-jni.c
"Compile x86  : hello-jni <= multiple.S
jni/multiple.S: Assembler messages:
jni/multiple.S:6: Error: no such instruction: `stmfd sp!,{fp,ip,lr}'
jni/multiple.S:7: Error: too many memory references for `mov'
jni/multiple.S:8: Error: too many memory references for `add'
jni/multiple.S:9: Error: no such instruction: `ldmfd sp!,{fp,ip,lr}'
jni/multiple.S:10: Error: no such instruction: `bx lr'
make: *** [obj/local/x86/objs-debug/hello-jni/multiple.o] Error 1

为什么这些说明不起作用? 我应该单独编译ARM代码吗?我想,ndk-build 会构建它。

--编辑 我的 application.mk 文件:

APP_ABI := all

【问题讨论】:

  • 为什么您的构建尝试编译到 x86 平台?这可能是您的错误背后的原因:stmfd 和 ldtmfd 是 ARM 指令,而不是 x86 指令。 libs/armeabi-v7a/libhello-jni.so 工作吗?
  • 我修改了帖子,只是在application.mk中有一行,我对Android原生东西很陌生,所以这是我第一次尝试,我只是尝试了一种hello-world- android-asm 我在互联网上找到的。我在 Windows 8 64bit 上,我想将它构建到 Android 4.3,我会在我的手机上尝试它,而不仅仅是在 emu 上(但首先在 emu 上没问题)而不使用任何 ARM 东西,JNI 本身运行良好
  • 如果有人能给我一个工作的 ARM 示例,我可以在 Android 下从 JNI 调用它,我也可以!我要实现的是从我的 Android 手机调用 ARM 指令
  • 是的,您正在为所有架构进行编译。如果您只想要 arm,请在 Application.mk 中使用 APP_ABI := armeabi
  • 其实可以的!这就是问题所在,非常感谢!现在我可以看到 ARM Assembly 的阶乘结果,在我的 Activity 窗口上想 JNI。也许你应该把它写成答案,我不能接受。

标签: android c android-ndk arm


【解决方案1】:

您正在为所有架构进行编译。如果您只想为 ARM 编译,请在 Application.mk 文件中使用 APP_ABI := armeabi

查看 NDK 安装中的 docs/APPLICATION-MK.html 了解更多信息。

【讨论】:

    猜你喜欢
    • 2021-11-19
    • 2016-08-14
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多