在ASM中定义函数并在Android NDK C ++代码中使用它

时间:2016-08-14 13:58:24

标签: android c++ assembly android-ndk arm

我只需要在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;

0 个答案:

没有答案