轉自:http://blog.csdn.net/jiuyueguang/article/details/9447245java
版權聲明:本文爲博主原創文章,未經博主容許不得轉載。linux
0:前言:android
- 這兩天一直在研究用android的jni調用第三方庫,上網搜方法,可是都是泛泛而談,沒有demo,通過我幾番折磨,寫了n多的 helloword工程,老是不成功,工程名字也就由helloowrd轉到shithelloword再轉到fuckhelloword再轉到 bitchhelloword再轉到ganhelloword再轉到helloword,在最後成功了!yeah,記錄下來,爲本身和他人方便
- 不 得不吐槽一下個人破電腦,ubuntu下eclipse打開後,cpu佔用率直接飆到180%,而後ubuntu就把eclipse給kill掉了,而後 eclipse就退出了,後來總結緣由是個人eclipse的工程中有android系統的整個文件系統的源碼,而後把他close project後就好多了,不會被ubuntu給kill掉了
- 篇幅介紹:
- 第一篇:主要是介紹從頭創建一個hello的工程,這裏面建立庫libhello.so而後在java程序中調用他,有一個相對來講一鼓作氣的步驟
- 第二篇:主要是介紹用android程序直接調用第三方庫
- 第三篇:主要是介紹用android程序整合第三方庫到本身的庫中,
- 在這三篇中,避免枯燥,做者會設置必定的場景,
- 若是做者有說的不對的地方,請指出,由於做者也是剛弄「明白」
[第一篇:android調用第三方庫——編寫庫libhello.so]程序員
[第二篇:android調用第三方庫——編寫庫android程序直接調用第三方庫libhello.so]ubuntu
[第三篇:android調用第三方庫——編寫庫android程序整合第三方庫libhello.so到本身的庫libhelloword.so]app
[第四篇:android調用第三方庫——調用多個第三方庫的寫法]
eclipse
1:場景:甲方非軟件公司要作一個android客戶端,功能主要是「人臉識別」,而後找到乙方軟件公司(該公司人臉識別比較牛逼,主要是用C++ 代碼實現人臉識別,可是這個公司沒有作android程序的,長遠考慮招一個會android的程序員,臨時考慮的話,把android程序外包給丙方軟 件公司)ide
2:分析:乙方C++公司如今的主要任務是作本身的業務邏輯庫,而後把庫交給丙方android公司來作android程序,而後交差拿錢。第一篇都是以乙方C++公司爲主體來作程序,做者以hello模擬函數
3:前提:ui
- ubuntu64位系統
- android-ndk-r8e已經安裝好,而且配置到eclipse裏面
- android-sdk-linux已經安裝好,而且配置到eclipse裏面
4:搞起:
新建一個android項目(這裏乙方C++公司新建的是android程序,後期會轉化爲C++程序),名稱爲hello;報名爲com.hello.hello如圖,圖中的jni和libs和obj文件夾不要管他,他們是後來自動生成的。
項目hello右鍵-》Android Tools-》Add Native Support-》填寫你須要生成的庫名稱,這裏寫hello就行,肯定以後就自動生成了jni文件夾了,裏面有hello.cpp和Android.mk
在HelloActivity.java中添加代碼如上圖
package com.hello.hello; import android.app.Activity; import android.app.AlertDialog; import android.os.Bundle; public class HelloActivity extends Activity { static { System.loadLibrary("hello"); } public static native String sayHello(); // 本地庫函數 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); new AlertDialog.Builder( this ).setMessage( sayHello() ).show(); } }
4.利用javah生成頭文件,並且利用eclipse整合javah的方式,比較方便,萬一個人java文件有修改的地方,利用這種方式顯示出極大的方便性,請尊駕移布[ubuntu下整合eclipse和javah生成jni頭文件開發android的native程序]
5.編寫jni文件夾下的hello.cpp文件
#include <string.h> #include <jni.h> #include "com_hello_hello_HelloActivity.h" /* * Class: com_hello_word_HellowordActivity * Method: sayHello * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_hello_hello_HelloActivity_sayHello(JNIEnv *env, jclass){ return env->NewStringUTF("hello"); } jint JNI_OnLoad(JavaVM* vm, void* reserved) { JNIEnv* env = NULL; jint result = -1; if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) { return result; } return JNI_VERSION_1_4; }
6.編寫jni文件夾下的Android.mk文件。
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello LOCAL_SRC_FILES := hello.cpp include $(BUILD_SHARED_LIBRARY)
7.修改項目的編譯選項:項目右鍵-》Properties-》C/C++ Build-》Build command中填寫你的android-ndk的根目錄;Behaviour選項卡中的Build爲空,
8.編譯項目,項目右鍵-》build project,會看到控制檯輸出,說明咱們的是正確的,good!
**** Build of configuration Default for project hello **** /opt/EmbedSky/android-ndk-r8e/ndk-build Compile++ thumb : hello <= hello.cpp SharedLibrary : libhello.so Install : libhello.so => libs/armeabi/libhello.so
9.運行android項目,會看到下圖,說明是正確的,至此咱們編寫的庫文件可以被正確的被本身的程序調用,
5:demo的下載地址[猛戳這裏下載demo]