我只需要在ARM asm中创建一个函数,然后必须由C ++代码执行,所有这些都是使用Android NDK编译的。
首先,以下是文件MyNDK.h
:
package com.example.test.ndktest;
public class MyNDK {
static {
System.loadLibrary("MyLibrary");
}
public native Integer addOne(int input);
}
在com_example_test_ndktest_MyNDK.h
文件中,我有:
/* Includes and ifdefs */
extern jint* asmFunction(jint*);
JNIEXPORT jint JNICALL Java_com_example_test_ndktest_MyNDK_addOne
(JNIEnv *env, jobject, jint& input) {
return *asmFunction(&input);
}
/* endifs */
没什么特别的,只是翻译的原生addOne
函数的定义,它将input
参数添加一个。
addOne
功能的用法如下:
在MainActivity.java
:
...
jint number = 1234;
MyNDK ndk = new MyNDK;
myndk.addOne(number); // Now number must contain 1235
...
现在,问题是,我不知道如何将input
参数(在com_example_test_ndktest_MyNDK.h
中)与asm代码相关联。换句话说,我需要asm .s
文件。
我认为可能有用的是从堆栈内存中读取,这是input
参数已保存的位置,但我不知道如何在ARM asm中执行此操作,因为我是我认为我正在为不同的架构完全混合使用asm语法。
作为一个例子,我只想要一个名为asmFunction
的简单asm函数声明,它接受一个jint*
参数,向该参数添加一个,并返回传递给它的参数的地址:
.global asmFunction
.type asmFunction, @function
asmFunction:
???
ret ; When I build the project, it says `Unrecognized opcode 'ret'´, maybe in ARM asm there is no `ret` opcode?
我想我需要热议。
编辑:
显然内联汇编不是一个选项,因为它甚至不识别在这个简单的程序中看到的mov指令,它将值newnum
放入地址number
:
int* number = new int(10);
int newnum = 42;
asm (
"mov %0,%1\n\t" <---- Unsupported instruction mov
:"=r"(number)
:"r"(newnum)
);
return *number;