Java如何調(diào)用本地.so庫(kù)里的方法

首先在此之前希望你已經(jīng)掌握了基本JNI常識(shí)的運(yùn)用倍宾,比如Java代碼如何調(diào)用本地native的方法流炕,native方法如何訪問本地變量辫愉,本地方法等以及其他相關(guān)的基礎(chǔ)知識(shí)顽决。在此我還是貼上Activity的部分代碼窍仰,如下:

// Used to load the 'native-lib' library on application startup.
  static {
    System.loadLibrary("native-lib");
  }
  public String name = "test";
  private int source[] = { 1, 4, 0, 7, 33, 11 };
@Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Example of a call to a native method
    TextView tv = (TextView) findViewById(R.id.sample_text);
    tv.setText(stringFromJNI());
    }
  /**
   * A native method that is implemented by the 'native-lib' native library,
   * which is packaged with this application.
   */
  public native String stringFromJNI();

  public native String updateNameFromC();//屬性訪問

  public native String getMethod();//方法訪問

  public native void getArray(int arrays[]);

  //引用解決什么問題呢汉规,什么時(shí)候通知JVM回收J(rèn)NI的對(duì)象
  public native void getLocalReference();

  //緩存策略,對(duì)象生命周期的問題
  public native void cachede();

  //測(cè)試
  public native String test(String str);

同理驹吮,本地cpp的代碼如下:

#include <jni.h>
#include <string>
#include <string.h>
#include "stdlib.h"
#include <android/log.h>
//首先將a強(qiáng)制聲明為指向整數(shù)的指針针史,然后讀取指針對(duì)應(yīng)的整數(shù)
int compare(const void *a,const void *b){
    return (*(int *)a-*(int *)b);
}

#define TAG "myDemo-jni" // 這個(gè)是自定義的LOG的標(biāo)識(shí)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG ,__VA_ARGS__) // 定義LOGD類型
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,TAG ,__VA_ARGS__) // 定義LOGI類型
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,TAG ,__VA_ARGS__) // 定義LOGW類型
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,TAG ,__VA_ARGS__) // 定義LOGE類型
#define LOGF(...) __android_log_print(ANDROID_LOG_FATAL,TAG ,__VA_ARGS__) // 定義LOGF類型


extern "C"
JNIEXPORT jstring
JNICALL
Java_com_example_ee_ndkdemo_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

運(yùn)行程序,則會(huì)發(fā)現(xiàn)在下面的目錄中生成了不同的.so庫(kù)碟狞,如下:


20180519164954.png

好的啄枕,第一步已經(jīng)完成。
其次族沃,新建一個(gè)項(xiàng)目频祝,將其不同的.so庫(kù)拷貝到項(xiàng)目的目錄下,這里有兩種方法脆淹,第一種常空,將.so庫(kù)拷貝到項(xiàng)目src->main->jniLibs下,不同的架構(gòu)放在這個(gè)目錄的不同文件夾下面即可盖溺,這是最簡(jiǎn)單的漓糙;第二種,將.so庫(kù)拷貝到項(xiàng)目app->libs中咐柜,不同的架構(gòu)放在這個(gè)目錄的不同文件夾下面即可兼蜈,但是這時(shí)候要在build.gradle中配置

rceSets{ 
main{ 
jniLibs.srcDirs = ['libs'] 
} 
}

這時(shí)候就會(huì)涉及到如何引用.so庫(kù)里面的方法了攘残,其實(shí)調(diào)用So庫(kù)里的方法也有兩種方式:
(1)So庫(kù)有對(duì)應(yīng)的jar包,把jar包放進(jìn)libs里就可以調(diào)用so庫(kù)里面的方法了为狸,當(dāng)然得先把so放進(jìn)jniLibs里歼郭;
(2)只有So庫(kù),沒有jar包辐棒,下面詳細(xì)討論這種情況…..
沒有jar包又想調(diào)用so里的方法病曾,其實(shí)也是很簡(jiǎn)單的,前提當(dāng)然是要把so庫(kù)放進(jìn)jniLibs里漾根,然后看下面的代碼

public class MainActivity {
  static {
    System.loadLibrary("native-lib");
  }

  public String hh(){
    return stringFromJNI();
  }
  
  public  static native String stringFromJNI();
  public  static native String getMethod();
}

實(shí)際上我這是希望在另外一個(gè)項(xiàng)目中調(diào)用之前打包成so庫(kù)的本地方法
stringFromJNI()泰涂,事實(shí)上中間有一個(gè)必須要注意的細(xì)節(jié),就是調(diào)用已經(jīng)打包so庫(kù)的那個(gè)類辐怕,必須要與已經(jīng)生成的so庫(kù)的類名逼蒙,包名都要一致,否則就會(huì)出現(xiàn)問題寄疏,這是一個(gè)細(xì)節(jié)是牢。所以筆者最后發(fā)現(xiàn)只有so庫(kù)的調(diào)用實(shí)際上還是相對(duì)麻煩一下,因?yàn)槟阋{(diào)用的一些第三方的so庫(kù)陕截,比人不會(huì)告訴你他們的報(bào)名驳棱,已經(jīng)加載這個(gè)so庫(kù)所在的類名。相反例如百度推送以及七牛云等相關(guān)的so庫(kù)农曲,別人會(huì)額外再提供你一個(gè)相關(guān)的jar包社搅,我們只需要操作jar包就Ok了,所以最終我認(rèn)為對(duì)第三方so庫(kù)里面方法的調(diào)用乳规,so庫(kù)配jar包的使用比單純的so庫(kù)的使用要簡(jiǎn)潔的多形葬。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市暮的,隨后出現(xiàn)的幾起案子荷并,更是在濱河造成了極大的恐慌,老刑警劉巖青扔,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件源织,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡微猖,警方通過查閱死者的電腦和手機(jī)谈息,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)凛剥,“玉大人侠仇,你說(shuō)我怎么就攤上這事。” “怎么了逻炊?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵互亮,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我余素,道長(zhǎng)豹休,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任桨吊,我火速辦了婚禮威根,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘视乐。我一直安慰自己洛搀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布佑淀。 她就那樣靜靜地躺著留美,像睡著了一般。 火紅的嫁衣襯著肌膚如雪伸刃。 梳的紋絲不亂的頭發(fā)上独榴,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音奕枝,去河邊找鬼。 笑死瓶堕,一個(gè)胖子當(dāng)著我的面吹牛隘道,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播郎笆,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼谭梗,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了宛蚓?” 一聲冷哼從身側(cè)響起激捏,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎凄吏,沒想到半個(gè)月后远舅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡痕钢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年图柏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片任连。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蚤吹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情裁着,我是刑警寧澤繁涂,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站二驰,受9級(jí)特大地震影響扔罪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜诸蚕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一步势、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧背犯,春花似錦坏瘩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至柱锹,卻和暖如春哪自,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背禁熏。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工壤巷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瞧毙。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓胧华,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親宙彪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子矩动,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,117評(píng)論 25 707
  • 引言 由于項(xiàng)目中需要用到JNI男图,以前雖然在Eclipse上使用過JNI和SO 文件示姿,移植到Android Stud...
    CrazyMO_閱讀 6,858評(píng)論 0 13
  • 上學(xué)時(shí)曾經(jīng)了解過思維導(dǎo)圖,它能夠提高我們學(xué)習(xí)逊笆、工作和辦事的效率峻凫,讓我們對(duì)整體有個(gè)宏觀的把握。 偶然的機(jī)會(huì)經(jīng)馮老師指...
    Moonlight_810e閱讀 395評(píng)論 0 1
  • 經(jīng)過一晚的思考览露,我整理了我對(duì)值月生的理解荧琼。 值月生并不同于學(xué)生時(shí)代的組長(zhǎng)、課代表,我把他視為一次機(jī)會(huì)命锄。...
    玉林林林林閱讀 289評(píng)論 4 2
  • 無(wú)豐的身影憑空出現(xiàn)在正在背手賞景的老者面前堰乔,這次不再是飄忽空中的魂魄,而是帶有溫?zé)嵫獾能|體脐恩。但老者并未有太多的驚...
    程序獵人閱讀 378評(píng)論 0 1