mirror of
https://github.com/Hamlib/Hamlib
synced 2026-08-13 17:32:05 -04:00
Android makefile fragments are distributed as extra distribution files by the GNU build system but are otherwise ignored. The Android build support is independent and does not rely on the GNU build system. See android/README.android for more info. Signed-off-by: Nate Bargmann <n0nb@n0nb.us>
123 lines
3.1 KiB
C
123 lines
3.1 KiB
C
/*
|
|
ltdl.c - ltdl emulation for android
|
|
Copyright (C) 2012 Ladislav Vaiz <ok1zia@nagano.cz>
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License
|
|
version 2 as published by the Free Software Foundation.
|
|
|
|
*/
|
|
|
|
#include <config.h>
|
|
#include <ltdl.h>
|
|
#include <dlfcn.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
#ifdef ANDROID
|
|
#include <android/log.h>
|
|
#endif
|
|
|
|
#define APREFIX "lib"
|
|
#define ASUFFIX ".so"
|
|
#define AMAXSTR 1024
|
|
#define ASONAME "libhamlib.so"
|
|
|
|
// path to application's libraries with trailing slash
|
|
char *libpath = NULL;
|
|
|
|
char *getlibpath(void){
|
|
char s[AMAXSTR];
|
|
FILE *f;
|
|
|
|
if (libpath != NULL) return libpath;
|
|
|
|
f = fopen("/proc/self/maps", "rt");
|
|
if (!f) return "./";
|
|
|
|
while (fgets(s, AMAXSTR - 1, f)){
|
|
char *c;
|
|
|
|
s[AMAXSTR - 1] = '\0';
|
|
c = strstr(s, ASONAME);
|
|
if (!c) continue;
|
|
|
|
// s is like "4a8a5000-4a8a6000 r--p 00018000 1f:01 743 /data/data/cz.nagano.tucnak/lib/libhamlib.so\n"
|
|
*c = '\0';
|
|
c = strchr(s, '/');
|
|
if (!c) continue;
|
|
libpath = malloc(strlen(c) + 1);
|
|
strcpy(libpath, c);
|
|
break;
|
|
}
|
|
fclose(f);
|
|
return libpath;
|
|
}
|
|
|
|
int lt_dlinit(void){
|
|
// __android_log_print(ANDROID_LOG_DEBUG, PACKAGE_NAME, "lt_dlinit");
|
|
return 0;
|
|
}
|
|
|
|
// not called from hamlib
|
|
int lt_dlexit(void){
|
|
// __android_log_print(ANDROID_LOG_DEBUG, PACKAGE_NAME, "lt_dlexit");
|
|
|
|
if (libpath != NULL){
|
|
free(libpath);
|
|
libpath = NULL;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int lt_dladdsearchdir(const char *search_dir){
|
|
// __android_log_print(ANDROID_LOG_DEBUG, PACKAGE_NAME, "lt_dladdsearchdir");
|
|
return 0;
|
|
}
|
|
|
|
lt_dlhandle adlopen(const char *filename){
|
|
char *c;
|
|
lt_dlhandle *ret;
|
|
|
|
// __android_log_print(ANDROID_LOG_DEBUG, PACKAGE_NAME, "adlopen('%s')", filename);
|
|
getlibpath();
|
|
if (libpath == NULL || filename == NULL) return NULL;
|
|
|
|
c = malloc(strlen(libpath) + strlen(APREFIX) + strlen(filename) + strlen(ASUFFIX) + 1);
|
|
strcpy(c, libpath);
|
|
strcat(c, APREFIX);
|
|
strcat(c, filename);
|
|
strcat(c, ASUFFIX);
|
|
|
|
ret = dlopen(c, 0);
|
|
// __android_log_print(ANDROID_LOG_DEBUG, PACKAGE_NAME, "adlopen('%s')=%p", c, ret);
|
|
free(c);
|
|
return ret;
|
|
}
|
|
|
|
lt_dlhandle lt_dlopen(const char *filename){
|
|
// __android_log_print(ANDROID_LOG_DEBUG, PACKAGE_NAME, "lt_dlopen(%s)", filename);
|
|
return adlopen(filename);
|
|
}
|
|
|
|
lt_dlhandle lt_dlopenext(const char *filename){
|
|
// __android_log_print(ANDROID_LOG_DEBUG, PACKAGE_NAME, "lt_dlopenext(%s)", filename);
|
|
return adlopen(filename);
|
|
}
|
|
|
|
int lt_dlclose(lt_dlhandle handle){
|
|
// __android_log_print(ANDROID_LOG_DEBUG, PACKAGE_NAME, "lt_dlclose");
|
|
return dlclose(handle);
|
|
}
|
|
|
|
void *lt_dlsym(lt_dlhandle handle, const char *name){
|
|
void *ret = dlsym(handle, name);
|
|
// __android_log_print(ANDROID_LOG_DEBUG, PACKAGE_NAME, "lt_dlsym(%s)=%p", name, ret);
|
|
return ret;
|
|
}
|
|
|
|
const char *lt_dlerror(void){
|
|
const char *ret = dlerror();
|
|
// __android_log_print(ANDROID_LOG_DEBUG, PACKAGE_NAME, "lt_dlerror=%s", ret);
|
|
return ret;
|
|
}
|