diff options
author | Jari Vetoniemi <mailroxas@gmail.com> | 2018-02-15 00:59:08 +0200 |
---|---|---|
committer | Jari Vetoniemi <mailroxas@gmail.com> | 2018-02-16 18:22:14 +0200 |
commit | 33a9a63787154facfdaddaf719e727947c159800 (patch) | |
tree | 46f92364199658fc3d439fc056996c9b9afc237c /src/app.c |
Initial commit
Stuff in src/linker will get rewritten from scratch eventually, it's all
horrible. But for now focus is getting on shit work.
Diffstat (limited to 'src/app.c')
-rw-r--r-- | src/app.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/app.c b/src/app.c new file mode 100644 index 0000000..6dd8e10 --- /dev/null +++ b/src/app.c @@ -0,0 +1,41 @@ +#include <stdlib.h> +#include <stdio.h> +#include <libgen.h> +#include <dlfcn.h> +#include <err.h> +#include <assert.h> + +extern void *apkenv_android_dlopen(const char*, int); +extern void *apkenv_android_dlclose(void*); +extern void *apkenv_android_dlsym(void*, const char*); +extern void apkenv_parse_library_path(const char *path, char *delim); + +int +main(int argc, const char *argv[]) +{ + if (argc < 2) + errx(EXIT_FAILURE, "usage: so-file"); + + dlopen("libpthread.so", RTLD_NOW | RTLD_GLOBAL); + + printf("loading: %s\n", argv[1]); + + char path[4096]; + snprintf(path, sizeof(path), "%s", argv[1]); + apkenv_parse_library_path(dirname(path), ";"); + + void *handle; + if (!(handle = apkenv_android_dlopen(argv[1], RTLD_NOW | RTLD_LOCAL))) + errx(EXIT_FAILURE, "dlopen failed: %s", dlerror()); + + printf("loaded: %s\n", argv[1]); + + void* (*JNI_OnLoad)(void*, void*) = apkenv_android_dlsym(handle, "JNI_OnLoad"); + assert(JNI_OnLoad); + + char data[1024]; + JNI_OnLoad(data, NULL); + + // apkenv_android_dlclose(handle); + return EXIT_SUCCESS; +} |