如何在android中運行C語言程序

問題闡述:linux

本人使用mini6410開發了一個sqlite數據庫的程序,在mini6410的linux系統下已經可以成功運行了。由於Android使用的也是linux內核,因此我想固然的認爲按照一樣的方法將程序移植到mini6410的android系統中也能夠成功運行,可是當我運行程序的時候卻提示我不能找到可執行文件(xlisten-arm是交叉編譯出來的可執行文件):android

/ # ./xlisten-arm
/system/bin/sh: ./xlisten-arm: not foundsql

1.探索:數據庫

在網上搜索起初認爲多是庫文件的不全致使的,因而在查看可執行文件xlisten-arm所須要的動態連接庫:函數

 

執行語句:spa

  1. # arm-linux-readelf -a ./xlisten-arm | grep "Shared"   
  2.  0x00000001 (NEEDED)                     Shared library: [libsqlite3.so.0]   
  3.  0x00000001 (NEEDED)                     Shared library: [libm.so.6]   
  4.  0x00000001 (NEEDED)                     Shared library: [libcrypt.so.1]   
  5.  0x00000001 (NEEDED)                     Shared library: [libpthread.so.0]   
  6.  0x00000001 (NEEDED)                     Shared library: [libdl.so.2]   
  7.  0x00000001 (NEEDED)                     Shared library: [libc.so.6]   

知道所需的動態連接庫後,到android文件系統中去照着寫庫文件,在目錄/system/lib 中,果真缺乏相應的庫文件,因而認爲找到了我問題的根源所在,在複製相應庫文件的時候爲了保留原來的屬性,還特地用了sqlite

  1. #cp -a filename dir  

 

誰知將這些庫都添加進去之後,仍然無濟於事!開發

看來不單單事庫文件缺失的問題了,並且通常來講,若是真的是由於缺乏庫文件而致使的問題,終端會提示咱們連接某庫文件時沒有找到該庫文件。get

2.正確的解決方法:it

將程序編譯的時候選擇靜態編譯,即便用選項 -static

我是對Makefile文件中的CFLAG變量進行修改

CFLAGS  =  -Wall 

改成;

CFLAGS  =  -Wall -static

然而此時又出現問題了:

undefined reference to `pthread_mutex_*'

undefined reference to `dl*'

提示沒有定義這些函數,因而在包含的庫文件中添加了這兩個庫文件

在Makefile中,修改LIBS變量;

LIBS    = -lsqlite3 -lm -lcrypt

改成:

LIBS    = -lsqlite3 -lm -lcrypt -lpthread -ldl

而後進行交叉編譯,成功了!

編譯出來的可執行文件比較大,由於事靜態編譯的,個人有2M多,

拷貝到開發板的andriod系統中,

修改權限:

#chmod 777 xlisten-arm

執行:

/ # ./xlisten-arm

OK!可以正確的執行了!

相關文章
相關標籤/搜索