現在の三重県亀山市と滋賀県甲賀市の境に位置する鈴鹿峠は、畿内と伊勢や東国を結ぶ重要な役割を果たした。そのため盗賊が横行する場所として名高く、鬼の棲家とされ、東海道を往来する旅人や物資を目当てにした盗賊が跳梁跋扈したことが古くから説話などに記されている。特に伊勢国は水銀の産地として有名で、『今昔物語集』巻29の36「於鈴香山蜂螫殺盗人語」では、水銀商人80余人が盗賊に襲われたが、日頃から恩を施していた蜂が飛んできて盗賊を刺したおかげで難を逃れたなどと記述される。他にも鬼の棲家とされたことから藤原千方の四鬼伝承なども伝わっていた。一方で鈴鹿の地は、斎王群行の途中に設けられた鈴鹿郡の頓宮が置かれ、豊かな水に恵まれていたことから斎宮が禊を行う鈴鹿禊の聖地であり、のちに巫覡の徒が祓えをおこなった神聖な地となった。こうした背景から平安時代末期の治承3年（1197年）頃に成立した『宝物集』に、奈良坂の金つぶてと共に「スゝカ山ノ タチエホウシ（鈴鹿山の立烏帽子）」の名前がみられ、鎌倉時代初期の承久の乱（1221年）前後に成立したとみられる『保元物語』「白河殿へ義朝夜討ちに寄せらるる事」では、伊賀の武士・山田是行の祖父・行秀が「立烏帽子」を捕縛したと記述している。建長6年（1254年）成立の『古今著聞集』巻12に「昔こそ鈴香山（鈴鹿山）の女盗人とて言ひ伝へたるに」との記述がみられるが、この女盗賊が『保元物語』の立烏帽子を示すものか定かでない。『弘長元年（1261年）公卿勅使記』では、鈴鹿山のうち凶徒の立つところとして西山口を挙げ、「昔立烏帽子在所ノ辺也。件ノ立烏帽子崇神社者、鈴鹿姫坐。路頭之北辺也」と注す。ここでは盗賊の名前が立烏帽子であり、鈴鹿姫はその盗賊が崇敬した社の女神として現れる。立烏帽子を女性とした描写は、鎌倉時代の文献にははっきりとした形では残っていない。南北朝時代以後、鈴鹿山の麓にある坂下では伊勢参宮の盛行を受けて宿場が整備され、往来の増加する中で、旅人を守護する存在として鈴鹿姫＝立烏帽子として認識されるようになっていく。盗賊立烏帽子と女神鈴鹿姫が同一視され、坂上田村麻呂の英雄譚に組み込まれるのは室町時代に入ってからと考えられる。14世紀に成立する『太平記』巻32「直冬上洛事付鬼丸事鬼切事」での鬼切の伝来について、田村麻呂が鈴鹿御前と剣合わせをしたという記述に伝承の融合が見られる。応永25年（1418年）の征夷大将軍・足利義持の伊勢参宮に随行した花山院長親が著した『耕雲紀行』に、当時の鈴鹿山の様子が記されており、「その昔勇力を誇った鈴鹿姫が国を煩わし、田村丸によって討伐されたが、そのさい身に着けていた立烏帽子を山に投げ上げた。これが石となって残り、今では麓に社を建て巫女が祀るという」と、この頃には鈴鹿御前と坂上田村麻呂伝説が融合していたことが伺える。
以下ではC/C++言語によるネイティブコードの記述例を用いて説明する。なおJNI関連のシンボル定義や関数宣言を含むヘッダーファイルは、Java Development Kit (JDK) に付属している。JNIフレームワークでは、ネイティブ関数はC/C++のソースファイル (拡張子は.cもしくは.cppなど) に分離して実装する。Java VMは、JNIEnvへのポインタ、コンテキストとしてJavaクラスもしくはクラスインスタンスを間接参照するポインタであるjobject、そしてJavaメソッドで定義されたすべてのJava引数を通して、ネイティブな関数を起動する。JNI関数は以下のようなC言語形式関数となる。C++のシグネチャは使えない。JNIEXPORT void JNICALLJava_PackageName_ClassName_MethodName  (JNIEnv *env, jobject obj){    /* ネイティブコードをここに記述する */}JNIEnvはJava VMへのインタフェースを含む構造体JNINativeInterfaceへのポインタである。これはJava VMとの相互作用および、Javaオブジェクトとの連携に必要な全ての関数ポインタを含んでいる。JNI関数の例としては、ネイティブ配列とJava配列の相互変換、ネイティブ文字列とJava文字列の相互変換、オブジェクトのインスタンス化、例外の送出などが挙げられる。基本的には、Javaコードでできることは全てJNIEnvを用いて行うことができる。以下の例ではJava文字列をネイティブな文字列に変換し、C/C++の標準ライブラリを利用して標準出力に出力する。/* C code */JNIEXPORT void JNICALLJava_com_example_TestClass_printString  (JNIEnv *env, jobject obj, jstring javaString){    /* Java 文字列より Modified UTF-8 形式のネイティブ文字列を取得する。 */    const char *nativeString = (*env)->GetStringUTFChars(env, javaString, NULL);    printf("%s\n", nativeString);    /* ネイティブ文字列を解放する。 */    (*env)->ReleaseStringUTFChars(env, javaString, nativeString);}// C++ codeextern "C" {JNIEXPORT void JNICALLJava_com_example_TestClass_printString  (JNIEnv *env, jobject obj, jstring javaString){    const char *nativeString = env->GetStringUTFChars(javaString, NULL);    std::cout << nativeString << std::endl;    env->ReleaseStringUTFChars(javaString, nativeString);}}上記のようにしてCまたはC++で記述した関数が myjni ライブラリモジュールに実装されていると仮定し、Javaプログラムから呼び出す例を示す。C/C++側の実装関数とJava側のメソッドバインディングは実行時に動的に解決される。package com.example;public class TestClass {    static {        System.loadLibrary("myjni");    }    public static native printString(String s);    public static void main(String[] args) {        printString("Hello, JNI.");    }}オブジェクト指向言語であるC++に対しては、Cよりも多少洗練されたJNI APIが提供される。C++ではJavaのように、オブジェクトのメソッド（メンバー関数）という概念を持つため、C++のJNIコードはCのそれに比べて文法的に多少簡潔である。Cではenvパラメータは(*env)->で被参照され、さらにenvパラメータはオブジェクトメソッド起動セマンティクスの一部として、明示的にJNIEnvメソッドに渡されなければならない。C++ではenvパラメータはenv->で被参照されるが、envパラメータはオブジェクトメソッド起動セマンティクスの一部として暗黙的に渡される。以降のコード例では、断りがない限りC++を前提とするものとする。