android調用第三方庫——第一篇 (轉載)

轉自:http://blog.csdn.net/jiuyueguang/article/details/9447245java

 

0:前言:android

  1. 這兩天一直在研究用android的jni調用第三方庫,上網搜方法,可是都是泛泛而談,沒有demo,通過我幾番折磨,寫了n多的 helloword工程,老是不成功,工程名字也就由helloowrd轉到shithelloword再轉到fuckhelloword再轉到 bitchhelloword再轉到ganhelloword再轉到helloword,在最後成功了!yeah,記錄下來,爲本身和他人方便
  2. 不 得不吐槽一下個人破電腦,ubuntu下eclipse打開後,cpu佔用率直接飆到180%,而後ubuntu就把eclipse給kill掉了,而後 eclipse就退出了,後來總結緣由是個人eclipse的工程中有android系統的整個文件系統的源碼,而後把他close project後就好多了,不會被ubuntu給kill掉了
  3. 篇幅介紹:
    1. 第一篇:主要是介紹從頭創建一個hello的工程,這裏面建立庫libhello.so而後在java程序中調用他,有一個相對來講一鼓作氣的步驟
    2. 第二篇:主要是介紹用android程序直接調用第三方庫
    3. 第三篇:主要是介紹用android程序整合第三方庫到本身的庫中,
    4. 在這三篇中,避免枯燥,做者會設置必定的場景,
  4. 若是做者有說的不對的地方,請指出,由於做者也是剛弄「明白」

[第一篇: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

  1. ubuntu64位系統
  2. android-ndk-r8e已經安裝好,而且配置到eclipse裏面
  3. 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項目,會看到下圖,說明是正確的,至此咱們編寫的庫文件可以被正確的被本身的程序調用,

  1. 如今項目完成,把項目中用的頭文件com_hello_hello_HelloActivity.h和生成的哭文件libhello.so(在libs/armeabi 文件夾下)和接口文檔交給項目經理,而後項目經理再轉交給丙方android公司
  2. 去看丙方android公司的笑話去吧-------》》》[第二篇:android利用jni調用第三方庫——編寫庫android程序直接調用第三方庫libhello.so]

5:demo的下載地址[猛戳這裏下載demo

相關文章
相關標籤/搜索