我對Assembly和ARM沒有特別的經驗,但是我可以在其中編寫幾個例程,我想看看他們如何在配備ARM的Android設備(Nexus S)上運行。將程序集代碼文件包含到Android項目中的過程是什麼?我只能從本地代碼或Java中調用它嗎?如何在Android項目中使用ARM彙編代碼?
14
A
回答
10
您可以使用Java Native Interface和Android NDK從Android調用程序集。
塞德里克提到使用asm關鍵字,而我更喜歡包含彙編源代碼。我已經發布了一個教程,可以在我的網站上執行此操作: http://www.eggwall.com/2011/09/android-arm-assembly-calling-assembly.html
您可以下載我的示例的源代碼並查看它的工作原理。一旦你看到一個有效的例子,很容易修改它以滿足你的需求。
3
3
帶內嵌和單獨的源文件
一些護理具有最小的示例將要採取的不編譯錯誤的拱形下的原始組件。這裏我們使用:
#ifdef
S於C文件ifeq
S於Android.mk
This example on GitHub。使用Android 5.1.1測試Ubuntu 16.04,Android NDK 12,Sony Xperia Z3 D6643(ARMv7)。
JNI/main.c中
#include <stdio.h>
#include <jni.h>
#ifdef __arm__
int asm_main(void);
#endif
jstring Java_com_cirosantilli_android_1cheat_ndk_1asm_Main_jniMethod(
JNIEnv* env, jobject thiz) {
enum Constexpr { N = 256 };
char s[N];
size_t cur = 0;
int x = 0;
#ifdef __arm__
cur += snprintf(s + cur, N - cur, "arm ");
/* Inline test. Increment x by 1. */
asm (
"add %0, #1"
: "=r" (x)
: "0" (x)
);
/* Separate source test. Increment x by 1. */
x += asm_main();
#endif
if (x == 2)
cur += snprintf(s + cur, N - cur, "%s", "0");
else
cur += snprintf(s + cur, N - cur, "%s", "1");
return (*env)->NewStringUTF(env, s);
}
JNI/main_asm.S
.text
/* Function that just returns 1. */
.global asm_main
asm_main:
mov r0, #1
bx lr
JNI/Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := main
LOCAL_SRC_FILES := main.c
# http://stackoverflow.com/questions/12614417/android-ndk-how-to-get-compiler-architecture-in-android-mk-dynamically
ifneq (,$(filter $(TARGET_ARCH_ABI),armeabi armeabi-v7a))
LOCAL_SRC_FILES := $(LOCAL_SRC_FILES) main_asm.S
endif
include $(BUILD_SHARED_LIBRARY)
COM/cirosantilli/android_cheat/ndk_asm/Main.java
package com.cirosantilli.android_cheat.ndk_asm;
import android.app.Activity;
import android.widget.TextView;
import android.os.Bundle;
public class Main extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
tv.setText(jniMethod());
setContentView(tv);
}
public native String jniMethod();
static {
System.loadLibrary("main");
}
}
相關問題
- 1. ARM彙編代碼
- 2. Keil arm startup.s彙編代碼
- 3. 瞭解ARM彙編代碼
- 4. 彙編代碼中的.arm是什麼?
- 5. C到arm彙編代碼轉換
- 6. ARM彙編 - 一個簡單的代碼
- 7. ASM在C++項目......這個小彙編代碼如何在C++
- 8. 如何編寫Makefile以將C代碼與Arm彙編代碼鏈接?
- 9. 調用ARM彙編
- 10. 如何使用Android設備(ARM)的NDK編譯C代碼?
- 11. 如何將此代碼更改爲ARM彙編指令?
- 12. arm彙編代碼 - 瞭解cpp源代碼的拆卸
- 13. 轉換C-代碼的ARM Cortex M3彙編代碼
- 14. Xcode項目中的ARM NEON代碼 - iOS
- 15. ARM彙編
- 16. 爲什麼qemu-arm在這個arm彙編代碼中反覆運行pthread_join?
- 17. 在Android上通過SSH編譯並運行ARM彙編代碼Lollipop
- 18. 使用匯編代碼
- 19. 如何在Xcode 4中將ARMV6彙編代碼設置爲ARM模式?
- 20. 一個包含C代碼和彙編代碼的C項目
- 21. 在彙編代碼中
- 22. 如何在C++內聯彙編代碼中使用字符串?
- 23. 如何使用gcc在Intel語法中生成彙編代碼?
- 24. 用keil uvision模擬彙編代碼(arm cortex m3)4
- 25. ARM彙編代碼查找表中未配對的值
- 26. ARM彙編 - 代碼在一個字符串
- 27. ARM彙編指令
- 28. ARM彙編迴路
- 29. ARM彙編數組
- 30. ARM彙編中的LDRMIB
非常酷,謝謝。 – Phonon
我沒有設法在我的項目中運行彙編代碼,但我甚至不知道我可能需要這個。但是,你的教程是驚人的,絕對值得投票。 – Wolfen