安卓环境搭建

Environment construction

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#编译环境
sudo apt install gcc-arm-linux-gnueabi

#愉快编译
arm-linux-gnueabi-gcc test.c -o test

#运行环境
sudo apt install qemu qemu-kvm qemu-system-arm

#愉快使用qemu跑起来
qemu-arm ./test

#root@ubuntu:~/Desktop# qemu-arm test
#/lib/ld-linux.so.3: No such file or directory
#出现这种问题跑一下
sudo cp /usr/arm-linux-gnueabi/lib/ld-linux.so.3 /lib
sudo cp /usr/arm-linux-gnueabi/lib/libgcc_s.so.1 /lib
sudo cp /usr/arm-linux-gnueabi/lib/libc.so.6 /lib

#调试环境
sudo apt install gdb-arm-none-eabi

#开启remote调试
qemu-arm -g 1234 test

(gdb) target remote localhost:1234
Remote debugging using localhost:1234
warning: A handler for the OS ABI "GNU/Linux" is not built into this configuration
of GDB. Attempting to continue with the default armv5t settings.

0xf67ceb00 in ?? ()
(gdb) b main
Breakpoint 1 at 0x844c
(gdb) r
The "remote" target does not support "run". Try "help target" or "continue".
(gdb) c
Continuing.

Breakpoint 1, 0x0000844c in main ()
(gdb) dis
disable disassemble disconnect display
(gdb) disassemble
Dump of assembler code for function main:
0x00008444 <+0>: push {r11, lr}
0x00008448 <+4>: add r11, sp, #4
=> 0x0000844c <+8>: ldr r0, [pc, #12] ; 0x8460 <main+28>
0x00008450 <+12>: bl 0x82e0 <printf@plt>
0x00008454 <+16>: mov r3, #0
0x00008458 <+20>: mov r0, r3
0x0000845c <+24>: pop {r11, pc}
0x00008460 <+28>: ldrdeq r8, [r0], -r8 ; <UNPREDICTABLE>
End of assembler dump.

A small example of jni

首先就是java文件(用于调用)和c文件(用于被调用)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public  class NativeDemo {
{
System.load("C:\\Users\\14555\\Desktop\\test\\sayHello.dll");//dll文件绝对路径
}
public native void sayHello();


public static void main(String[] args) {
new NativeDemo().sayHello();
}
}

#include "NativeDemo.h"
#include <windows.h>
#include <stdio.h>

JNIEXPORT void JNICALL Java_NativeDemo_sayHello(JNIEnv *, jobject){
using namespace std;
printf("hello!jniworld");
}

其中NativeDemo.h是根据javac -h -jni NativeDemo.java自动生成,但这得注意把生成的#include <jni.h>改成#include "jni.h"然后把需要的文件拷到当前目录(最简单的方式)

dll文件生成就是这样,比较简单
g++ -m64 -shared hello.cpp -o sayHello.dll

之后就是java文件编译运行了

1
2
3
4
5
6
C:\Users\14555\Desktop\test
λ javac NativeDemo.java

C:\Users\14555\Desktop\test
λ java NativeDemo
hello!jniworld