2015-03-26 2 views
1

Я экспериментирую с родными libs cross, скомпилированными из ubuntu. Я действительно хочу, чтобы иметь возможность компилировать мои библиотеки C++ и использовать их в приложении Xamarin.Android.Собственные библиотеки libs скомпилированы из ubuntu linux таргетинга arm (android)

Во-первых, у меня есть gcc-компилятор: arm-linux-gnueabi-gcc. У меня есть простая lib (libmr.so), которая имеет одну функцию void Print();, которая печатает что-то на консоли. Я компиляции с:

arm-linux-gnueabi-gcc -Wall -shared -o libmr.so mr.c 

При осмотре его с помощью file libmr.so кажется, что все будет хорошо. Однако, когда я включаю его в приложение для Android и пытаюсь его загрузить, он как будто его не существует. Я уверен, что он есть, путь абсолютно правильный, поскольку я пытался загрузить еще одну lib (libmonodroid.so) из той же папки, и она сработала.

Я попытался проверки обоих LIBS, чтобы найти какой-то разницы:

$ 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 загрузить ОМТ)

EDIT:

Я построил исполняемый, используя один и тот же набор инструментов, дал мне ключ:

  • Статическое связывание с LIBC: arm-linux-gnueabi-gcc -Wall -o hi source.c -static. Выдвинул hi на свои Android-устройства и выполнил его с adb. Результат: УСПЕХ!
  • Динамическое соединение с libc: arm-linux-gnueabi-gcc -Wall -o hi source.c. Результат: его даже нет! Значение ./hi дает /system/bin/sh: ./hi: not found, хотя это абсолютно так.

Итак, похоже, что libc действительно является виновником? Может быть, мне нужно связать динамически с не libc.so.6, а с libc.so точно так же, как libmonodroid.so делает?

+0

Использование ndk в качестве автономной инструментальной цепочки для создания вашего mr.c. http://stackoverflow.com/a/5239573/1163019 – auselen

+0

@auselen yes Я сейчас изучаю это, выглядит многообещающим. Вернется с результатами. – mrahhal

ответ

0

Отметьте this для тех, кто имеет ту же проблему. Загрузите ndk, есть отдельная инструментальная цепочка для создания собственных lib, которые запускаются на Android, который вы можете извлечь (вам не понадобится весь ndk).

0

я смог запустить базовое приложение на 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.

Смежные вопросы