android JNI 使用的兩種形式 --自己實現c和調用第三方so庫

1. 在調用JNI的工程中實現JNI代碼

JNI調用,一般書上都會給你講第一種形式,自己寫JNI代碼,,然後編譯使用,在eclipse中  --項目--右鍵-   Android tools --添加本地支持(add native support)。然後編譯運行就可以了。 自己寫JNI代碼,首先聲明java native調用,然後用javah 命令生成 JNI形式的頭文件,這個文件就是聲明的 java native 聲明 所對應的形式,然後自己按照這個形式寫一個.c實現形式,就是自己的功能。聲明的形式,其實就是 java + 包名+類名的形式。這個網上很多教程都講有。這個鏈接中有講到 javah 命令需要 到classes目錄下執行。

http://blog.csdn.net/xnwyd/article/details/7086384

===============================

我們用ls命令查看,可以看到bin目錄下有個classes目錄,其目錄結構爲classes/org/tonny/jni,即classes的子目錄結構是android工程的包名org.tonny.jni。請注意,下面我們準備執行javah命令的時候,必須進入到org/tonny/jni的上級目錄,即classes目錄,否則javah會提示找不到相關的java類。

========================

2. 調用第三方so庫,兩個條件,1。把so庫放到libs下面,注意把armeabi這樣的目錄一起復制進來,對應不同的架構,2. 把java native 聲明的類和包加入到工程中。

   如果只是簡單的在調用so庫的類中聲明 和加載動態庫的話,是會報找不到so庫的鏈接錯誤。這個原因,估計是程序去了默認的路徑 也就是Android系統庫(/system/lib)下面去查找了,所以查找不到(猜測,也許只是 調用的形式不對而導致 無法調用到而已。。。。系統的動態庫,估計就是這樣簡單的聲明native一下方法,然後加載動態庫就可以用了)。

  public nativeString  getRootURLFromJNI();

  publicnative String getKeyNameFromJNI();

  publicnative String getKeyValueFromJNI();

  static {

        System.loadLibrary("xxxx");

     }

   }

直接在代碼中聲明然後加載動態庫,運行就掛求了。



考慮到 JNI的形式,是 有包名  類名的,這麼強調應該是有要求的,所以把JNI的java native聲明類也加入到工程中,然後在調用的地方,使用一個聲明類的對象來調用JNI方法。這樣就可以了。



總之,第一種形式,已經自然的包含了包名 類名了,調用第三方的 so庫,則要加入對應的包名和類名。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章