JNI介紹和文檔

JNI

簡介

JNI是JAVA和C/C++相互調(diào)用的橋梁

文檔 官方文檔

類型映射

Jni中定義了原始類型和java中的類型一一對應(yīng)

Java 類型 原始類型
boolean jboolean
byte jbyte
char jchar
short jshort
int jint
long jlong
float jfloat
double jdouble
void void
true JNI_TRUE
false JNI_FALSE
types4.gif

類型簽名

當Jni獲取java中方法時壳影,由于java有重載,Jni不知道具體調(diào)哪個方法,所以存在簽名

簽名 Java類型
Z boolean
B byte
C char
S short
I int
J long
F float
D double
L fully-qualified-class ; fully-qualified-class
[ type type[]
( arg-types ) ret-type method type
V void
示例 
long f (int n, String s, int[] arr); 
簽名為 (ILjava/lang/String;[I)J

extern "C"
JNIEXPORT void JNICALL
Java_com_example_mynative_MainActivity_start(JNIEnv *env, jobject thiz, jint type,
                                             jobject on_click_listener) {
    jclass pJclass = env->GetObjectClass(on_click_listener);
    //通過object獲取到Class 
//    jclass pJclass = env->FindClass("com/example/mynative/MyListener");
    __android_log_print(ANDROID_LOG_DEBUG, "C", "pJclass is haha");
    if (pJclass != 0) {
    
        jmethodID pId = env->GetMethodID(pJclass, "onSuccess", "(I)V");
        //通過方法名和方法簽名獲取到class中的方法id
        if (pId != 0) {
            jint step = 100;
            __android_log_print(ANDROID_LOG_DEBUG, "C", "I am here");
            env->CallVoidMethod(on_click_listener, pId, step);
            // 調(diào)用之前獲取到的方法
        }
    }

}
  • 注意:getMethodID時的方法簽名,是前一步獲取class的方法簽名 不是java中的native方法
  • javac com/example/mynative/MyListener.java
  • javap -s -p com/example/mynative/MyListener
  • 可以通過上述方法獲取簽名

接口函數(shù)表

Code Example 4-1
const struct JNINativeInterface ... = {

    NULL,
    NULL,
    NULL,
    NULL,
    GetVersion,

    DefineClass,
    FindClass,

    FromReflectedMethod,
    FromReflectedField,
    ToReflectedMethod,

    GetSuperclass,
    IsAssignableFrom,

    ToReflectedField,

    Throw,
    ThrowNew,
    ExceptionOccurred,
    ExceptionDescribe,
    ExceptionClear,
    FatalError,

    PushLocalFrame,
    PopLocalFrame,

    NewGlobalRef,
    DeleteGlobalRef,
    DeleteLocalRef,
    IsSameObject,
    NewLocalRef,
    EnsureLocalCapacity,

    AllocObject,
    NewObject,
    NewObjectV,
    NewObjectA,

    GetObjectClass,
    IsInstanceOf,

    GetMethodID,

    CallObjectMethod,
    CallObjectMethodV,
    CallObjectMethodA,
    CallBooleanMethod,
    CallBooleanMethodV,
    CallBooleanMethodA,
    CallByteMethod,
    CallByteMethodV,
    CallByteMethodA,
    CallCharMethod,
    CallCharMethodV,
    CallCharMethodA,
    CallShortMethod,
    CallShortMethodV,
    CallShortMethodA,
    CallIntMethod,
    CallIntMethodV,
    CallIntMethodA,
    CallLongMethod,
    CallLongMethodV,
    CallLongMethodA,
    CallFloatMethod,
    CallFloatMethodV,
    CallFloatMethodA,
    CallDoubleMethod,
    CallDoubleMethodV,
    CallDoubleMethodA,
    CallVoidMethod,
    CallVoidMethodV,
    CallVoidMethodA,

    CallNonvirtualObjectMethod,
    CallNonvirtualObjectMethodV,
    CallNonvirtualObjectMethodA,
    CallNonvirtualBooleanMethod,
    CallNonvirtualBooleanMethodV,
    CallNonvirtualBooleanMethodA,
    CallNonvirtualByteMethod,
    CallNonvirtualByteMethodV,
    CallNonvirtualByteMethodA,
    CallNonvirtualCharMethod,
    CallNonvirtualCharMethodV,
    CallNonvirtualCharMethodA,
    CallNonvirtualShortMethod,
    CallNonvirtualShortMethodV,
    CallNonvirtualShortMethodA,
    CallNonvirtualIntMethod,
    CallNonvirtualIntMethodV,
    CallNonvirtualIntMethodA,
    CallNonvirtualLongMethod,
    CallNonvirtualLongMethodV,
    CallNonvirtualLongMethodA,
    CallNonvirtualFloatMethod,
    CallNonvirtualFloatMethodV,
    CallNonvirtualFloatMethodA,
    CallNonvirtualDoubleMethod,
    CallNonvirtualDoubleMethodV,
    CallNonvirtualDoubleMethodA,
    CallNonvirtualVoidMethod,
    CallNonvirtualVoidMethodV,
    CallNonvirtualVoidMethodA,

    GetFieldID,

    GetObjectField,
    GetBooleanField,
    GetByteField,
    GetCharField,
    GetShortField,
    GetIntField,
    GetLongField,
    GetFloatField,
    GetDoubleField,
    SetObjectField,
    SetBooleanField,
    SetByteField,
    SetCharField,
    SetShortField,
    SetIntField,
    SetLongField,
    SetFloatField,
    SetDoubleField,

    GetStaticMethodID,

    CallStaticObjectMethod,
    CallStaticObjectMethodV,
    CallStaticObjectMethodA,
    CallStaticBooleanMethod,
    CallStaticBooleanMethodV,
    CallStaticBooleanMethodA,
    CallStaticByteMethod,
    CallStaticByteMethodV,
    CallStaticByteMethodA,
    CallStaticCharMethod,
    CallStaticCharMethodV,
    CallStaticCharMethodA,
    CallStaticShortMethod,
    CallStaticShortMethodV,
    CallStaticShortMethodA,
    CallStaticIntMethod,
    CallStaticIntMethodV,
    CallStaticIntMethodA,
    CallStaticLongMethod,
    CallStaticLongMethodV,
    CallStaticLongMethodA,
    CallStaticFloatMethod,
    CallStaticFloatMethodV,
    CallStaticFloatMethodA,
    CallStaticDoubleMethod,
    CallStaticDoubleMethodV,
    CallStaticDoubleMethodA,
    CallStaticVoidMethod,
    CallStaticVoidMethodV,
    CallStaticVoidMethodA,

    GetStaticFieldID,

    GetStaticObjectField,
    GetStaticBooleanField,
    GetStaticByteField,
    GetStaticCharField,
    GetStaticShortField,
    GetStaticIntField,
    GetStaticLongField,
    GetStaticFloatField,
    GetStaticDoubleField,

    SetStaticObjectField,
    SetStaticBooleanField,
    SetStaticByteField,
    SetStaticCharField,
    SetStaticShortField,
    SetStaticIntField,
    SetStaticLongField,
    SetStaticFloatField,
    SetStaticDoubleField,

    NewString,

    GetStringLength,
    GetStringChars,
    ReleaseStringChars,

    NewStringUTF,
    GetStringUTFLength,
    GetStringUTFChars,
    ReleaseStringUTFChars,

    GetArrayLength,

    NewObjectArray,
    GetObjectArrayElement,
    SetObjectArrayElement,

    NewBooleanArray,
    NewByteArray,
    NewCharArray,
    NewShortArray,
    NewIntArray,
    NewLongArray,
    NewFloatArray,
    NewDoubleArray,

    GetBooleanArrayElements,
    GetByteArrayElements,
    GetCharArrayElements,
    GetShortArrayElements,
    GetIntArrayElements,
    GetLongArrayElements,
    GetFloatArrayElements,
    GetDoubleArrayElements,

    ReleaseBooleanArrayElements,
    ReleaseByteArrayElements,
    ReleaseCharArrayElements,
    ReleaseShortArrayElements,
    ReleaseIntArrayElements,
    ReleaseLongArrayElements,
    ReleaseFloatArrayElements,
    ReleaseDoubleArrayElements,

    GetBooleanArrayRegion,
    GetByteArrayRegion,
    GetCharArrayRegion,
    GetShortArrayRegion,
    GetIntArrayRegion,
    GetLongArrayRegion,
    GetFloatArrayRegion,
    GetDoubleArrayRegion,
    SetBooleanArrayRegion,
    SetByteArrayRegion,
    SetCharArrayRegion,
    SetShortArrayRegion,
    SetIntArrayRegion,
    SetLongArrayRegion,
    SetFloatArrayRegion,
    SetDoubleArrayRegion,

    RegisterNatives,
    UnregisterNatives,

    MonitorEnter,
    MonitorExit,

    GetJavaVM,

    GetStringRegion,
    GetStringUTFRegion,

    GetPrimitiveArrayCritical,
    ReleasePrimitiveArrayCritical,

    GetStringCritical,
    ReleaseStringCritical,

    NewWeakGlobalRef,
    DeleteWeakGlobalRef,

    ExceptionCheck,

    NewDirectByteBuffer,
    GetDirectBufferAddress,
    GetDirectBufferCapacity,

    GetObjectRefType
  };
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末陶夜,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌战惊,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件同欠,死亡現(xiàn)場離奇詭異样傍,居然都是意外死亡,警方通過查閱死者的電腦和手機铺遂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門衫哥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人襟锐,你說我怎么就攤上這事撤逢。” “怎么了粮坞?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵蚊荣,是天一觀的道長。 經(jīng)常有香客問我莫杈,道長互例,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任筝闹,我火速辦了婚禮媳叨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘关顷。我一直安慰自己糊秆,他們只是感情好,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布议双。 她就那樣靜靜地躺著痘番,像睡著了一般。 火紅的嫁衣襯著肌膚如雪平痰。 梳的紋絲不亂的頭發(fā)上汞舱,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天,我揣著相機與錄音宗雇,去河邊找鬼兵拢。 笑死,一個胖子當著我的面吹牛逾礁,可吹牛的內(nèi)容都是我干的说铃。 我是一名探鬼主播访惜,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼腻扇!你這毒婦竟也來了债热?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤幼苛,失蹤者是張志新(化名)和其女友劉穎窒篱,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舶沿,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡墙杯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了括荡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片高镐。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖畸冲,靈堂內(nèi)的尸體忽然破棺而出嫉髓,到底是詐尸還是另有隱情,我是刑警寧澤邑闲,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布算行,位于F島的核電站,受9級特大地震影響苫耸,放射性物質(zhì)發(fā)生泄漏州邢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一褪子、第九天 我趴在偏房一處隱蔽的房頂上張望量淌。 院中可真熱鬧,春花似錦褐筛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至信轿,卻和暖如春晃痴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背财忽。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工倘核, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人即彪。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓紧唱,卻偏偏與公主長得像活尊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子漏益,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

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

  • JNI 學(xué)習(xí)筆記 1.概述 Java Native Interface(JNI) 是JDK提供的一個native編...
    JellyJoe_943閱讀 4,183評論 1 13
  • 0.要素1.類操作2.異常操作3.全局及局部引用4.對象操作5.字符串操作6.數(shù)組操作7.訪問對象的屬性和方法7....
    MagicalGuy閱讀 1,346評論 0 2
  • ref: Android Studio開發(fā)JNI示例Android NDK 開發(fā)(二)JNI 傳遞參數(shù)和返回值A(chǔ)n...
    richy_閱讀 1,603評論 0 8
  • 花了幾天時間研究了下JNI蛹锰,基本上知道如何使用了。照我的觀點JNI還是不難的绰疤,難得只是我們一份嘗試的心铜犬。 學(xué)習(xí)過程...
    皇小弟閱讀 1,621評論 0 1
  • 還是很喜歡彩鉛風(fēng)景畫,看到幾個黑點了嗎轻庆?那是一群勤勞的人在田間工作癣猾!
    木子手繪閱讀 220評論 2 1