从 ubuntu linux 目标 arm (android) 交叉编译的本机库
Native libs cross compiled from ubuntu linux targeting arm (android)
我正在试验从 ubuntu 交叉编译的本机库。我真正想要的是能够编译我的 C++ 库并在 Xamarin.Android 应用程序中使用它们。
首先,我有arm gcc编译器:arm-linux-gnueabi-gcc
。我有一个简单的库 (libmr.so),它有一个函数 void Print();
,可以将某些内容打印到控制台。我正在编译:
arm-linux-gnueabi-gcc -Wall -shared -o libmr.so mr.c
使用 file libmr.so
检查它时,一切似乎都很好。但是,当我将它包含在我的 android 应用程序中并尝试加载它时,就好像它不存在一样。我确定它在那里,路径是绝对正确的,因为我试图从同一个文件夹加载另一个库(libmonodroid.so
)并且它有效。
我尝试检查两个库以发现某种差异:
$ objdump -x libmr.so | grep NEEDED
NEEDED libc.so.6
$ objdump -x libmonodroid.so | grep NEEDED
NEEDED libc.so
... (in addition to other libs)
这是我在两者之间发现的唯一区别。 libmonodroid.so
加载正确,但 libmr.so
就像它不存在一样。 (我正在使用 dlopen
加载库)
编辑:
我使用相同的工具链构建了一个可执行文件,给了我一个线索:
- 静态 link 使用 libc:
arm-linux-gnueabi-gcc -Wall -o hi source.c -static
。将 hi
推送到我的 android 设备并使用 adb
执行它。结果:成功!
- 动态 link 使用 libc:
arm-linux-gnueabi-gcc -Wall -o hi source.c
。结果:它甚至不存在!意思是 ./hi
给出 /system/bin/sh: ./hi: not found
尽管它绝对存在。
所以,看来 libc 真的是罪魁祸首?也许我需要动态 link 而不是 libc.so.6
而是 libc.so
就像 libmonodroid.so
正在做的那样?
检查 this 是否有遇到相同问题的人。下载 ndk,有一个用于构建本机库的独立工具链 运行 在 android 上,您可以提取它(您不需要整个 ndk)。
我能够 运行 ubuntu 15.04 上的一个基本应用程序,这个 Makefile 与我的 hi.c:
$ cat hi.c # create hi.c with favorite editor
#include <stdio.h>
int main(int argc, char** argv) {
int uid = getuid();
int eid = geteuid();
printf("Hello world\n");
printf("You are uid: %d and eid; %d", uid, eid);
return 0;
}
$ cat Makefile # create two line Makefile
CC=arm-linux-gnueabi-gcc
LDFLAGS=-static
$ make hi # build arm based hi executable file
arm-linux-gnueabi-gcc -static hi.c -o hi
$ file hi # check file type
hi: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=17b65e60cdd32449ac237bfd1b8238bfa1d416a0, not stripped
$ adb push hi /data/local/tmp # copy to droid fon
4403 KB/s (593252 bytes in 0.131s)
$ adb shell /data/local/tmp/hi # run hi executable
adb shell /data/local/tmp/hi
Hello world
You are uid: 2000 and eid; 2000
$ uname -a
Linux lenny 3.19.0-28-generic #30-Ubuntu SMP Mon Aug 31 15:52:51 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
请注意,我没有安装任何 NDK。
我正在试验从 ubuntu 交叉编译的本机库。我真正想要的是能够编译我的 C++ 库并在 Xamarin.Android 应用程序中使用它们。
首先,我有arm gcc编译器:arm-linux-gnueabi-gcc
。我有一个简单的库 (libmr.so),它有一个函数 void Print();
,可以将某些内容打印到控制台。我正在编译:
arm-linux-gnueabi-gcc -Wall -shared -o libmr.so mr.c
使用 file libmr.so
检查它时,一切似乎都很好。但是,当我将它包含在我的 android 应用程序中并尝试加载它时,就好像它不存在一样。我确定它在那里,路径是绝对正确的,因为我试图从同一个文件夹加载另一个库(libmonodroid.so
)并且它有效。
我尝试检查两个库以发现某种差异:
$ objdump -x libmr.so | grep NEEDED
NEEDED libc.so.6
$ objdump -x libmonodroid.so | grep NEEDED
NEEDED libc.so
... (in addition to other libs)
这是我在两者之间发现的唯一区别。 libmonodroid.so
加载正确,但 libmr.so
就像它不存在一样。 (我正在使用 dlopen
加载库)
编辑:
我使用相同的工具链构建了一个可执行文件,给了我一个线索:
- 静态 link 使用 libc:
arm-linux-gnueabi-gcc -Wall -o hi source.c -static
。将hi
推送到我的 android 设备并使用adb
执行它。结果:成功! - 动态 link 使用 libc:
arm-linux-gnueabi-gcc -Wall -o hi source.c
。结果:它甚至不存在!意思是./hi
给出/system/bin/sh: ./hi: not found
尽管它绝对存在。
所以,看来 libc 真的是罪魁祸首?也许我需要动态 link 而不是 libc.so.6
而是 libc.so
就像 libmonodroid.so
正在做的那样?
检查 this 是否有遇到相同问题的人。下载 ndk,有一个用于构建本机库的独立工具链 运行 在 android 上,您可以提取它(您不需要整个 ndk)。
我能够 运行 ubuntu 15.04 上的一个基本应用程序,这个 Makefile 与我的 hi.c:
$ cat hi.c # create hi.c with favorite editor
#include <stdio.h>
int main(int argc, char** argv) {
int uid = getuid();
int eid = geteuid();
printf("Hello world\n");
printf("You are uid: %d and eid; %d", uid, eid);
return 0;
}
$ cat Makefile # create two line Makefile
CC=arm-linux-gnueabi-gcc
LDFLAGS=-static
$ make hi # build arm based hi executable file
arm-linux-gnueabi-gcc -static hi.c -o hi
$ file hi # check file type
hi: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=17b65e60cdd32449ac237bfd1b8238bfa1d416a0, not stripped
$ adb push hi /data/local/tmp # copy to droid fon
4403 KB/s (593252 bytes in 0.131s)
$ adb shell /data/local/tmp/hi # run hi executable
adb shell /data/local/tmp/hi
Hello world
You are uid: 2000 and eid; 2000
$ uname -a
Linux lenny 3.19.0-28-generic #30-Ubuntu SMP Mon Aug 31 15:52:51 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
请注意,我没有安装任何 NDK。