我正在使用ARM64-v8a
上的Android工作室构建Android应用,可以请求汇编功能。
在线搜索了大量信息后,我仍然无法解决这个问题。
我的
CMakeList.txt
如下:
cmake_minimum_required(VERSION 3.4.1)
enable_language(ASM)
set(can_use_assembler TRUE)
set(CMAKE_VERBOSE_MAKEFILE on)
#add_definitions(-DANDROID -DNDEBUG -DOC_ARM_ASM)
set_source_files_properties(multiple.s PROPERTIES COMPILE_FLAGS "-x
assembler-with-cpp")
add_library( # Sets the name of the library.
native-lib
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
src/main/cpp/native-lib.cpp
src/main/cpp/multiple.s
)
multiple.s
的代码为
.session .text
.align 2
.global armFunction
.type armFunction, %function
armFunction:
@ Multiply by 10. Input value and return value in r0
stmfd sp!, {fp,ip,lr}
mov r3, r0, asl #3 @ r3=r0<<3=r0*8
add r0, r3, r0, asl #1 @ r0=r3+r0<<1=r0*8+r0*2=r0*10
ldmfd sp!, {fp,ip,lr}
bx lr
.size armFunction, .-armFunction
native-lib.cpp
的代码如下:
extern "C"
int armFunction(int);
JNIEXPORT jstring JNICALL
Java_com_example_zyf_testarm_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++ ";
int x = 1;
char info[1024] = "";
x = x + armFunction(10);
sprintf(info,"%d",x);
return env->NewStringUTF(info); //hello.c_str()
}
错误信息是
错误:未知指令 .session .text
错误:语句开头的意外令牌 @乘以10.输入值和返回值r0
这些只是错误消息的一部分。实际上,它表明multiple.s
中的每条指令都是unknown
。
有人指出问题可能是
case sensitive
。所以我尝试使用另一个名为.S
的{{1}}文件。main_asm.S
的代码如下:
main_asm.S
问题仍然存在:
未知指令
我提出了另一个问题Question Link。
我认为问题是由同样的原因引起的。也许我的.text
.global asm_main
asm_main:
mov r0, #1
bx lr
效果不佳?我不知道,请帮忙:)。
非常感谢帮助我解决这个问题:)
答案 0 :(得分:2)
bx lr
和寄存器 r0..r15
是 32 位 ARM,而不是 AArch64 / ARM64-v8a。 ARM64 寄存器是 x0..31(它们的低半部分是 w0..31),然后返回 ret
(br
的别名)
确保 64 位构建不会尝试构建 32 位 asm 源文件。
或者,如果您有 32 位 asm 源代码,请确保您只进行 32 位构建。
答案 1 :(得分:1)
我在Android Studio(V3.1.2)中遇到了相同的问题“ unknown token / instruction / ...”,并使用abiFilters(在app / build.gradle中)解决了该问题,但未引用ndk:
android {
...
defaultConfig {
...
externalNativeBuild {
cmake {
cppFlags ""
abiFilters 'armeabi-v7a'
}}}
...
}
(也许将armeabi-v7a更改为arm64-v8a)
希望有帮助
(您可以在此处查看项目:https://github.com/denisb/GPerf)