Android JNI之靜態(tài)注冊(cè)(android studio)

起源

說(shuō)到JNI,起初是滿臉頭痛仑濒。公司業(yè)務(wù)偷遗,呵呵,opengl喉酌,當(dāng)初是java來(lái)寫的泵喘,后邊說(shuō)是c++效率高纪铺,對(duì)此,我笑一笑從容霹陡。任務(wù)到手烹棉,沒(méi)辦法怯疤,就是干。什么某狗伏社,什么36啊,什么某毒摘昌,嗖嗖嗖,嘿嘿罕容,一個(gè)Hello JNI告訴我這個(gè)JNI還是很友好的稿饰。描述一下當(dāng)時(shí)我所接受的第一個(gè)JNI程序。

一旅择。創(chuàng)建JNI Floder侣姆, 將c++代碼放入其中,然后查看頭文件

這個(gè)地方要注意汇歹,是要生成JNI Floder類型的文件夾偿凭,如果隨便創(chuàng)建一個(gè)文件夾叫jni,那么不好意思痰哨,我大as是不認(rèn)識(shí)的匾嘱。一個(gè)溫馨的提示,讓人愛得沉醉霎烙。

make.exe: *** No rule to make target .  Stop.
jni目錄代碼展示圖

頭文件代碼展示圖

二悬垃。根據(jù)c++頭文件編寫java端接口尝蠕,并使用javah命令生成jni頭文件

這個(gè)呢,沒(méi)什么好說(shuō)的看彼。java要跟c++進(jìn)行交流囚聚,需要一個(gè)橋梁标锄,橋的這頭是java,那頭是c++料皇,中間的是jni,你不搞點(diǎn)事情是不行的毒返。就這樣舷手,普通話出現(xiàn)了,你懂我懂大家懂盆赤,才能展開深入交流歉眷,嘿嘿嘿∈缂剩回歸正題扇住,看代碼,看命令:

package net.mapout.jni;

/**
 * Created by Tower on 2017/5/25.
 * java jni 接口申明
 */
public class JNILoader {
    static {
        /**
         * JniDemo 為build的so文件名
         */
        System.loadLibrary("JniDemo");
    }

    public static native String sayHello();
}
打開Terminal锄贼,進(jìn)入/app/src/main/java目錄下
D:\Study_Code\JniDemo>   cd app/src/main/java

執(zhí)行javah命令女阀,生成頭文件net_mapout_jni_JNILoader.h到j(luò)ni目錄下
D:\Study_Code\JniDemo\app\src\main\java>  javah -d ../jni net.mapout.jni.JNILoader

三。實(shí)現(xiàn)jni頭文件net_mapout_jni_JNILoader.h冯键,并調(diào)用別人家寫的c++代碼的榛。

這個(gè)實(shí)現(xiàn)文件可以瞎命名逻锐,但必須是.c/.c++為后綴雕薪,實(shí)現(xiàn)文件嘛所袁,嗯凶掰?嗯。

#include "net_mapout_jni_JNILoader.h"
#include "hello.h"
#include <string>

/**
 * std::string 轉(zhuǎn)  jstring
 */
jstring str2jstring(JNIEnv* env, std::string str)
{
    const char* pStr = str.c_str();
    int        strLen    = strlen(pStr);
    jclass     jstrObj   = env->FindClass("java/lang/String");
    jmethodID  methodId  = env->GetMethodID(jstrObj, "<init>", "([BLjava/lang/String;)V");
    jbyteArray byteArray = env->NewByteArray(strLen);
    jstring    encode    = env->NewStringUTF("UTF-8");
    env->SetByteArrayRegion(byteArray, 0, strLen, (jbyte*)pStr);
    return (jstring)env->NewObject(jstrObj, methodId, byteArray, encode);
}

/**
 * 實(shí)現(xiàn)頭文件
 */
JNIEXPORT jstring JNICALL Java_net_mapout_jni_JNILoader_sayHello
  (JNIEnv *env, jclass jclass){
    return str2jstring( env, sayHello() );
}
項(xiàng)目文件結(jié)構(gòu)圖

四。到此畅涂,準(zhǔn)備工作已經(jīng)完成。等等立宜,還有配置臊岸。配置嘛,一般一般灯帮。

首先逻住,在項(xiàng)目的gradle.properties中配置一句:

android.useDeprecatedNdk=true

看字面意思,過(guò)時(shí)瞪醋,沒(méi)錯(cuò)装诡,就是過(guò)時(shí)了,為啥還要配置呢鸦采,怪我咯渔伯。時(shí)代在進(jìn)步,從當(dāng)年的時(shí)代在召喚到如今的...今天天氣不錯(cuò),涼風(fēng)有幸蓝厌,秋月無(wú)邊古徒,雖然我不是玉樹臨風(fēng)...在打怪升級(jí)的路上,免不了有新的boss出現(xiàn)代态,cmake的火爆疹吃,這只是個(gè)意外,美麗的意外必尼,這個(gè)暫且不提篡撵。有了首先,當(dāng)然還需要然后撐腰券盅。在當(dāng)前 module 下的 build.gradle 中加入使用ndk膛檀,配置如下:

android {
    defaultConfig {
        ndk {
            moduleName "JniDemo"
            abiFilters "armeabi", "armeabi-v7a", "x86"  //輸出指定三種abi體系結(jié)構(gòu)下的so庫(kù)∮韭可有可無(wú)嚎杨。
            cFlags "-std=c++11" //c++版本
            stl "gnustl_static" //支持 stl 標(biāo)準(zhǔn)庫(kù)
        }
    }
}

ndk,最后刨肃,還需要設(shè)置ndk環(huán)境箩帚。這個(gè)就是一個(gè)F4,千萬(wàn)別手殘多按了一個(gè)ALT(如果一起按了盔然,那么恭喜你,再接再厲挺尾,下次更精彩)刻帚,進(jìn)入項(xiàng)目配置界面SDK Location->Android NDK location涩嚣,設(shè)置NDK目錄即可。當(dāng)然也可以通過(guò)手動(dòng)在項(xiàng)目的 local.properties 中添加顷歌,舉栗如下:

ndk.dir=E\:\\adt-bundle-windows-x86_64-20140321\\android-ndk-r10

激動(dòng)幔睬。想一下,還有什么需要配置赦抖?搞事情辅肾。忘了就忘了吧,忘一忘要尔,十年笑新娜。

五。收工还惠。

biu biu biu私杜,build apk,見證奇跡的時(shí)刻到了嚎幸,這一刻屬于你們寄猩,也屬于我。缺陷不能不提替废,比如說(shuō)jni頭文件名稱超長(zhǎng)。當(dāng)初java诈火,c++状答,c三分天下,誰(shuí)也不服誰(shuí)拍摇」萁兀互聯(lián)網(wǎng)的格局,瞬息萬(wàn)變混卵。合作窖张,隨之而來(lái)。java要跟c/c++交流合陵,無(wú)縫對(duì)接澄阳,請(qǐng)了一個(gè)臭皮匠過(guò)來(lái),趕時(shí)間低剔。然后這位臭皮匠肮塞,啰里啰唆、老生常談的做法猜欺。一個(gè)有效的交流拷窜,嗨涧黄,我來(lái)自xx省xx市笋妥,祖籍xx窄潭。說(shuō)完這些,恭喜你月帝,接下來(lái)均抽,你可以聊天了其掂。吐槽,歸吐槽深寥。技術(shù)贤牛,總是在革新殉簸。這種方式,稱之為靜態(tài)注冊(cè)般卑。那么蝠检,相反呢。
附送一張機(jī)票饲梭,帶你領(lǐng)略世界的浩瀚

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末焰檩,一起剝皮案震驚了整個(gè)濱河市析苫,隨后出現(xiàn)的幾起案子布蔗,更是在濱河造成了極大的恐慌浪腐,老刑警劉巖议街,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異吧雹,居然都是意外死亡涂身,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)悴能,“玉大人,你說(shuō)我怎么就攤上這事冯凹〕闯埃” “怎么了夫凸?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵寸痢,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我啼止,道長(zhǎng)道逗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任献烦,我火速辦了婚禮滓窍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘巩那。我一直安慰自己吏夯,他們只是感情好此蜈,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著噪生,像睡著了一般。 火紅的嫁衣襯著肌膚如雪跺嗽。 梳的紋絲不亂的頭發(fā)上战授,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音桨嫁,去河邊找鬼植兰。 笑死,一個(gè)胖子當(dāng)著我的面吹牛璃吧,可吹牛的內(nèi)容都是我干的楣导。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼畜挨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼筒繁!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起朦促,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤膝晾,失蹤者是張志新(化名)和其女友劉穎栓始,沒(méi)想到半個(gè)月后务冕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡幻赚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年禀忆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片落恼。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡箩退,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出佳谦,到底是詐尸還是另有隱情戴涝,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布钻蔑,位于F島的核電站啥刻,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏咪笑。R本人自食惡果不足惜可帽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窗怒。 院中可真熱鬧映跟,春花似錦蓄拣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至荸镊,卻和暖如春碎捺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贷洲。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工收厨, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人优构。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓诵叁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親钦椭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拧额,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

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