利用Android Studio編寫 Android上的c與c++程序


 

 

利用Android Studio編寫 Android上的c與c++程序

  (2017-05-22 19:01:20)

 

Android Studio 2.3.1

 FrankNote: Android 3.1.2

 

1.       新建New Project:

a)         利用Android <wbr>Studio編寫 <wbr>Android上的c與c++程序


b)         利用Android <wbr>Studio編寫 <wbr>Android上的c與c++程序


c)         利用Android <wbr>Studio編寫 <wbr>Android上的c與c++程序


d)         利用Android <wbr>Studio編寫 <wbr>Android上的c與c++程序



e)         利用Android <wbr>Studio編寫 <wbr>Android上的c與c++程序


2.       自動打開新建的工程:

a)         以project的方式顯示工程:

利用Android <wbr>Studio編寫 <wbr>Android上的c與c++程序

b)         Main目錄下新建jni文件夾:

FrankNote: 如果之前沒有安裝NDK, 自動下載NDK,  退出,重新打開Android Studio 就可以看到下圖所示的項目

利用Android <wbr>Studio編寫 <wbr>Android上的c與c++程序

c)         jni文件夾下新建test_hello_world.cpp:

利用Android <wbr>Studio編寫 <wbr>Android上的c與c++程序

d)         jni文件夾下新建Android.mk:

FrankNote:  

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_CFLAGS += -pie -fPIE
LOCAL_LDFLAGS += -pie -fPIE

LOCAL_MODULE := test_hello_world
LOCAL_SRC_FILES =: test_hello_world.cpp
include $(BUILD_EXECUTABLE)
LOCAL_CFLAGS += -pie -fPIE
LOCAL_LDFLAGS += -pie -fPIE

 原因 PIE這個安全機制從4.1引入,但是Android L之前的系統版本並不會去檢驗可執行文件是否基於PIE編譯出的。因此不會報錯。但是Android L已經開啟驗證,如果調用的可執行文件不是基於PIE方式編譯的,則無法運行。解決辦法非常簡單,在Android.mk中加入如下flag就行。

https://blog.csdn.net/hxdanya/article/details/39371759

FrankNote End

 

利用Android <wbr>Studio編寫 <wbr>Android上的c與c++程序

e)         jni文件夾下新建Application.mk文件,作用在於支持c++共享庫:

FrankNote:

APP_STL := gnustl_static
原因:
原方案使用的是共享庫,這不一定都支持所有的機型,改用靜態庫gnustl_static  問題解決。
https://blog.csdn.net/luozhuang/article/details/36418229

利用Android <wbr>Studio編寫 <wbr>Android上的c與c++程序

f)          注意觀察project下的local.properties文件:

利用Android <wbr>Studio編寫 <wbr>Android上的c與c++程序

g)         修改project下的gradle.properties文件,增加配置android.useDeprecatedNdk=true,其作用在於告訴系統使用ndk編譯:

利用Android <wbr>Studio編寫 <wbr>Android上的c與c++程序

h)         修改app目錄下的build.gradle文件,增加配置:

                         i.              ndk的abiFilters配置作用在於限定生成的cpu/abi。

                       ii.              jni.srcDirs = [] 表示禁止as自動ndk編譯,采用手動ndk-build。

                      iii.              jniLibs.srcDirs = [‘src/main/libs’]  表示經過ndk-build編譯后的so路徑。

利用Android <wbr>Studio編寫 <wbr>Android上的c與c++程序

i)           jni文件夾下新建Cmd script,make_x86.cmd,用於手動ndk-build:

利用Android <wbr>Studio編寫 <wbr>Android上的c與c++程序

j)           右鍵點擊make_x86.cmd文件選擇Run cmd script:

利用Android <wbr>Studio編寫 <wbr>Android上的c與c++程序

利用Android <wbr>Studio編寫 <wbr>Android上的c與c++程序

 

k)         獲得目標程序文件test_hello_world:

C:\Users\jacki\AppData\Local\Android\Sdk\ndk-bundle\ndk-build.cmd APP_ABI="x86"

利用Android <wbr>Studio編寫 <wbr>Android上的c與c++程序

利用Android <wbr>Studio編寫 <wbr>Android上的c與c++程序

 

3.       在Android虛擬機中執行程序:

a)         開啟x86 cpu/abi的虛擬機:

利用Android <wbr>Studio編寫 <wbr>Android上的c與c++程序

b)         使用adb命令把文件傳到Android虛擬機中,並賦予可執行權限:

靜態庫沒有.so文件

利用Android <wbr>Studio編寫 <wbr>Android上的c與c++程序

c)         添加當前路徑為so庫文件查找路徑命令,防止elf文件運行階段找不到so庫的問題,LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/local/tmp

利用Android <wbr>Studio編寫 <wbr>Android上的c與c++程序

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM