Build android executable so lib with ndk
references:
实现可执行的so动态链接库
Sample
1 |
|
CMakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12cmake_minimum_required(VERSION 3.5)
project (hello_shared)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
# set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-e,lib_entry")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-e__lib_main")
add_library(hello SHARED hello.c)
add_executable(hello_shared main.c)
target_link_libraries(hello_shared dl)build.sh
1
2
3
4
5
6
7
8
9#!/bin/bash
rm -rf build-android
mkdir build-android
cd build-android
cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
-DANDROID_ABI="arm64-v8a" \
-DANDROID_NDK=$ANDROID_NDK \
-DANDROID_PLATFORM=android-21 ..
makehello.c
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
// Must define the interpretor to be the dynamic linker
#ifdef __ANDROID__
#ifdef __LP64__
const char service_interp[] __attribute__((section(".interp"))) = "/system/bin/linker64";
#else
const char service_interp[] __attribute__((section(".interp"))) = "/system/bin/linker";
#endif
#endif
struct CmdLine{
int argc;
char ** argv;
};
void ReadCmdLine(struct CmdLine * pLine){
pLine->argc = 0;
pLine->argv = NULL;
int32_t iFileId = open("/proc/self/cmdline", O_RDONLY, 0644);
if (iFileId < 0){
return ;
}
char szBuff[8192];
int iFileSize = read(iFileId, szBuff, sizeof(szBuff));
int iBegin = 0;
int iTemp = 0;
close(iFileId);
for (iTemp = 0; iTemp < iFileSize; iTemp++){
if (szBuff[iTemp] == '\0'){
pLine->argc++;
}
}
pLine->argv = (char **)malloc(pLine->argc * sizeof(char *));
for (iTemp = 0, pLine->argc = 0; iTemp < iFileSize; iTemp++){
if (szBuff[iTemp] == '\0'){
char * p = (char *)malloc(iTemp - iBegin + 1);
memcpy(p, szBuff + iBegin, iTemp - iBegin);
p[iTemp - iBegin] = '\0';
pLine->argv[pLine->argc++] = p;
iBegin = iTemp + 1;
}
}
}
void __lib_main(void) {
printf("Entry point of libhello.so \n");
struct CmdLine cmdLine;
ReadCmdLine(&cmdLine);
printf("argc:%d\n", cmdLine.argc);
int iTemp = 0;
for ( ; iTemp < cmdLine.argc; iTemp++)
{
printf("arg:%s\n", cmdLine.argv[iTemp]);
}
_exit(0);
}
void lib_entry() {
printf("Entry point of lib_entry\n");
exit(0);
}
void hello() {
printf("Entry point of hello\n");
}main.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22#include <dlfcn.h>
#include <stdio.h>
int main() {
void *handle = dlopen("./libhello.so", RTLD_LAZY);
if (!handle) {
fprintf(stderr, "Error: %s\n", dlerror());
return 1;
}
void (*hello)() = dlsym(handle, "hello");
if (!hello) {
fprintf(stderr, "Error: %s\n", dlerror());
return 1;
}
hello();
dlclose(handle);
return 0;
}
Build
1 |
|
Run in android
1 |
|
Build android executable so lib with ndk
https://hqw700.github.io/2024/03/30/2024-03-30-ndk-build-android-executable-so/