android c++ gizp 调用 so,使用ndk-build编译 android调用的so库
前沿
編譯so的方法有兩種方法第一種就是編寫原生的makefile文件利用gcc進行編譯,這里我講解的是另外一種。采用NDK提供的ndk-build編譯。
簡介
使用ndk編譯的時候需要介紹它的腳本文件,Android.mk和Application.mk,但是Application.mk是可選的,用來描述原生程序用到的一些特性,如原生程序支持的ARM指令集。
Android.mk是工程的編譯腳本,描述了編譯原生程序所需要的選擇項、頭文件、源文件以及依賴庫等。
實例
首先需要下載DNK,這個就不用多說了,我直接來說步驟吧。程序員一般都會對Hello,world感到親切,我們就從hello,word開始。利用eclipse新建一個項目我取了新建了一個andoridNDKTest這個項目,先看看項目目錄吧。
這里注意到上面的多了一個jni目錄,這個目錄就是java通過jni調(diào)用的代碼放的地方,里面放了三個文件,我們還是首先來講一下hello-jni.c這個文件,我們來看看代碼。
#include?
#include?
jstring
Java_com_example_ndktest_MainActivity_stringFromJNI(?JNIEnv*?env,
jobject?thiz?)
{
return?(*env)->NewStringUTF(env,?"Hello?world?");
}
代碼很簡單就是命名有點長,第一個Java不用管就是jni的規(guī)定,然后后面的就是包路徑和類名稱最后是函數(shù)名。這個函數(shù)的作用就是返回一個字符串。
然后就是利用ndk來編譯這個函數(shù)了,我們需要看看Android.mk和Applicaion.mk文件里面到底有些什么。
android.mk
LOCAL_PATH?:=?$(call?my-dir)
include?$(CLEAR_VARS)
LOCAL_MODULE????:=?hello
LOCAL_SRC_FILES?:=?hello-jni.c
include?$(BUILD_SHARED_LIBRARY)
LOCAL_PATH:=($call my-dir)定義了本地源碼路徑 call my-dir是編譯系統(tǒng)提供的,返回的就是mk的路徑。
include $(CLEAR_VARS) 指定讓編譯系統(tǒng)清楚掉一些已經(jīng)定義過的宏,這些宏定義都是全局的,如LOCAL_MODULE、LOCAL_SRC_FILE,當(dāng)一個GUN MAKE在編譯多個模塊時候,必須清楚并且重新設(shè)置他們。
LOCAL_ARM_MODE := arm指定原生程序用的指令集,這里上面我們沒有用到。
LOCAL_MODULE:= hello指定生成程序的文件名,如果生成共享的庫模塊會生成libhello.so.
LOCAL_SRC_FILE:=hello-jni.c指定c或者c++源文件。
inlude $(BUILD_EXECUTABLE)指定生成文件的類型,BUILD_EXECUTABLE表示可執(zhí)行文件,BUILD_SHARED_LIBRARY表示生成動態(tài)庫,BUILD_STATIC_LIBRARY靜態(tài)庫。
然后是Applicaion.mk文件
APP_ABI?:=?all
這句代碼的意思是生成所有平臺的編譯結(jié)果。
其實到了這里你就可以直接進入jni文件夾里面輸入ndk-build開始編譯了,但是為了看到編譯過后的運行結(jié)果我這里在eclipse里面編譯,看圖說話。
然后編譯器就會自動的編譯文件,最后就是android這邊的調(diào)用了,我們來看看andorid的文件代碼
public?class?MainActivity?extends?Activity?{
//聲明c的接口
public?native?String?stringFromJNI();
static?{
System.loadLibrary("hello");
}
@Override
protected?void?onCreate(Bundle?savedInstanceState)?{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView?textView?=?(TextView)?findViewById(R.id.hello);
textView.setText(stringFromJNI());
}
}
然后讓我們注意的是這句代碼
public native String stringFromJNI();
其實它就是函數(shù)生命,但是采用的native因為是在so里面的。
static {
System.loadLibrary("hello");
}
這句函數(shù)就更簡單了,直接加載我們剛才編譯好的so庫。好了,如果沒什么問題就直接run在手機上看效果吧。
總結(jié)
以上是生活随笔為你收集整理的android c++ gizp 调用 so,使用ndk-build编译 android调用的so库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 机器人动画,Androi
- 下一篇: 储蓄卡可以还信用卡吗