1. 程式人生 > >使用NDK編譯C/C++為.so檔案

使用NDK編譯C/C++為.so檔案

概述:

Android NDK是一系列工具的集合。幫助開發者快速開發C(或C++)的動態庫,並能自動將so和java應用一起打包成apk。NDK集成了交叉編譯器,並提供了相應的mk檔案隔離平臺、CPU、API等差異,開發人員只需要簡單修改mk檔案(指出“哪些檔案需要編譯”、“編譯特性要求”等),就可以創建出so。NDK可以自動地將so和Java應用一起打包,極大地減輕了開發人員的打包工作。

http://dl.google.com/android/ndk/android-ndk-r7-windows.zip

建立目錄jni,比如F:\NDK-Build\jni,要編譯的C/C++程式碼在該目錄的外層(即F:\ClientSocketEngine

jni目錄下為mk檔案


其中Android.mk檔案如下

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := u3dtools_shared
LOCAL_MODULE_FILENAME := libu3dtools

# 配置自己的原始檔目錄和原始檔字尾名
MY_FILES_PATH  :=  $(LOCAL_PATH) \
                   $(LOCAL_PATH)/../../ClientSocketEngine

MY_FILES_SUFFIX := %.cpp %.c

# 遞迴遍歷目錄下的所有的檔案
rwildcard=$(wildcard $1$2) $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2))

# 獲取相應的原始檔
MY_ALL_FILES := $(foreach src_path,$(MY_FILES_PATH), $(call rwildcard,$(src_path),*.*) ) 
MY_ALL_FILES := $(MY_ALL_FILES:$(MY_CPP_PATH)/./%=$(MY_CPP_PATH)%)
MY_SRC_LIST  := $(filter $(MY_FILES_SUFFIX),$(MY_ALL_FILES)) 
MY_SRC_LIST  := $(MY_SRC_LIST:$(LOCAL_PATH)/%=%)

# 去除字串的重複單詞
define uniq =
  $(eval seen :=)
  $(foreach _,$1,$(if $(filter $_,${seen}),,$(eval seen += $_)))
  ${seen}
endef

# 遞迴遍歷獲取所有目錄
MY_ALL_DIRS := $(dir $(foreach src_path,$(MY_FILES_PATH), $(call rwildcard,$(src_path),*/) ) )
MY_ALL_DIRS := $(call uniq,$(MY_ALL_DIRS))

# 賦值給NDK編譯系統
LOCAL_SRC_FILES  := $(MY_SRC_LIST)
#LOCAL_C_INCLUDES := $(MY_ALL_DIRS)

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../ClientSocketEngine

include $(BUILD_SHARED_LIBRARY)
Application.mk檔案如下
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -DCOCOS2D_DEBUG=1 -fexceptions

build_native.bat指令碼如下
@set "NDK_ROOT=E:/InstallPack/android-ndk-r9d"

@set "DIR=%cd%"
@REM ... use paths relative to current directory
@set "APP_ROOT=%DIR%/.."
@set "APP_ANDROID_ROOT=%DIR%"

@echo NDK_ROOT = %NDK_ROOT%
@echo APP_ROOT = %APP_ROOT%
@echo APP_ANDROID_ROOT = %APP_ANDROID_ROOT%

@echo Using prebuilt externals
@"%NDK_ROOT%/ndk-build.cmd" 
pause

執行build_native.bat指令碼,生成libu3dtools.so檔案,搞定

相關推薦

使用NDK編譯C/C++.so檔案

概述: Android NDK是一系列工具的集合。幫助開發者快速開發C(或C++)的動態庫,並能自動將so和java應用一起打包成apk。NDK集成了交叉編譯器,並提供了相應的mk檔案隔離平臺、CPU

Unity使用NDK在Android平臺上引用C++程式碼的so檔案(下)

由於最近進入了公司,手頭上的工作需要一點一點的去適應,所以沒有空來完成接下來的博文,今天突然想到寫一些,發現這麼久沒有接觸了,好像已經忘記了很多,寫下這個博文,我也正好回顧一個這一方面的知識。 關於在unity上使用C++的程式碼需要用到SO檔案了,這就像Cocos上使用C

Unity使用NDK在Android平臺上引用C++程式碼的so檔案(上)

這是我的第一篇博文,在我剛開始實現本文功能是的,感悟真的是挺深的,為了給大家分享我的探索經驗也為了以後自己方便查閱,寫下此篇博文學習一種新的東西,一定要從最簡單的開始,把一切需要實現的功能做到最容易實現的地步,比如說引用外部一個方法,就要把這個方法做到最簡單,比如說這個方法沒

C++呼叫外部so檔案

利用extern “C” 構建一個外部C庫 //testlibc.cpp #include<iostream> extern "C" void test() { std::cou

NDK編譯支援C++11

APP_CPPFLAGS += -std=c++11 // APP_CPPFLAGS += -std=gnu++11 NDK_TOOLCHAIN_VERSION=4.8 APP_STL=gnustl_

Java在linux下呼叫C/C++生成的so檔案

1.CplusUtil.java是java web工程中的一個工具類內容如下:CplusUtil.java [java] view plain copy  print? package cn.undoner.utils;   /**   * Created 

Android NDK編譯C程式

    怎麼配置NDK就不說了,網上教程多的是,現在說一下怎麼在不依賴Android Studio的情況下手動使用NDK編譯可以直接在Android上執行的程式(不是庫哦)。 隨便找個目錄,建一個資料夾,在這裡命名為tubashu,進入目錄,建一個hello.c檔案,程式

cmake簡單使用及編譯專案打包成so檔案

簡介 CMake是一個跨平臺的編譯自動配置工具,它使用一個名為CMakeLists.txt的檔案來描述構建過程,可以產生標準的構建檔案。它可以用簡單的語句來描述所有平臺的安裝(編譯過程)。它能夠輸出各種各樣的makefile或者project檔案,能測試編譯器所支援的C++特性,類似UNIX下的

android JNI執行NDK編譯成的可執行檔案

1.android環境的可執行檔案的生成 所謂的android下的可執行檔案,其實就是一般的c/c++程式碼使用NDK編譯出來的應用程式。它和linux下用gcc編譯出來的程式和windows系統下的.exe檔案是一樣的。要將程式碼編譯成可執行檔案只需要將編譯so的inc

利用java程式碼實現java原始檔的編譯和打包jar檔案

一、編譯部分 public void complier() throws IOException { System.out.println("*** --> 開始編譯java原始碼..."

編譯專案打包成so檔案

CMake--C++程式碼打成.so包 1. 藉助CMake打.so包  把目錄utils下的檔案打出.so包。 其中CMakeLists.txt內容: cmake_minimum_required(VERSION 2.8)aux_source_directo

android studio ndk-build 編譯C生成.so檔案ndk基礎篇)

一、概要 最近專案需要,要把程式碼中加密的部分打包成so檔案,剛開始接觸的時候真是痛苦呀,網上好多資料,都不是很詳細,步驟也不清晰,所以我整理了一下,希望大家喜歡。 現在android studio打包so檔案有兩種方式,第一種是ndk-build編譯專案,還有一種用

Python解密網易雲音樂.ncm檔案,將.ncm檔案轉換.mp3檔案,實現隨處播放(另附C++已編譯轉換器)

網易雲音樂把.mp3音樂檔案加密為.ncm檔案,導致不能將下載好的音樂複製到其它裝置或使用非網易雲音樂播放器播放,該程式可將.ncm檔案逆向解密為.mp3檔案並保留最高音質。 另有C++已編譯.exe轉換器,將.ncm檔案拖到.exe上直接執行轉換,生成.mp3檔案在.ncm檔案相同路徑。點選下

c編譯,呼叫動態連線庫 (.so檔案)

c編譯,呼叫動態連線庫 (.so檔案) C編譯: 動態連線庫 (.so檔案) Linux動態連結庫.so檔案的命名及用途總結 Linux程式設計練習(二)—— Linux下.so動態庫的建立和呼叫 在“紙上談兵: 演算法與資料結構”中,我在每一篇都會有一個C程式,用於實現演算法和資料

ndk編譯C檔案

#!/bin/sh OS='linux' ANDROIDSDK='android-14' PROGDIR='/home/guohai/dev/android-ndk-r7/' PROGDIR=`cd $PROGDIR && pwd` ARMEABI

Android Studio 3.0 Jni 開發環境配置 ndk cmake編譯 多個C/C++檔案新增配置

為什麼要用cmake?我先說一下cmake的優點: 1.配置簡單,只需要一個text檔案幾句程式碼即可完成Jni環境配置 2.請看下圖: 第一張圖是在幹什麼?debug C/C++程式碼啊!驚不驚險刺不刺激?! 都能夠直接debug了,新增檔案新

android studio編譯c生成.so檔案

今天練習了用studio編譯c生成.so檔案。 一、首先是配置NDK(以下是以我自己的路徑為例) 二、環境的搭建 設定ndk路徑 成功之後我們可以在local.properties檔案中看到:

linux下gcc編譯 .c檔案生成動態連結庫 .so檔案,並測試呼叫該連結庫

簡單介紹:linux中so檔案為共享庫,和windows下dll相似;so可以共多個程序呼叫,不同程序呼叫同一個so檔案,所使用so檔案不同;so原檔案不需要main函式;例項,1.通過mysqlTest.c中的函式mysql(),生成一個libmysql.so連結庫#inc

C語言讀取二進位制檔案,讀取結果全部零,編譯執行都沒有報錯

利用fread讀取二進位制檔案,讀出來的結果全部為零,編譯執行都沒有報錯,程式碼如下, 有人說是大小端的問題,怎麼理解啊?判斷出來的本機器的為little endian,怎麼判斷需不需要轉換啊?要是需要轉換,怎麼轉換啊?在網上找了利用巨集處理進行大小端轉換的程式碼,但是在我這種情況下,怎

NDK編譯C/C++檔案

1. android  ndk  + CDT Window --> Preference --> Android --> NDK --> NKD Location 配置D:\Android\android-ndk-r9d C/C++ --> D