JNIEXPORTとJNICALLは、NDK_ROOT/platforms/android-9/arch-arm/usr/include/jni.hで定義されています。設定によっては、このパスは異なりますが、ほとんど同じです。
#define JNIIMPORT
#define JNIEXPORT __attribute__ ((visibility ("default")))
#define JNICALL
JNIEXPORTは、ネイティブ関数が構築されたバイナリ(* .soというファイル)の動的テーブルに表示させるために使用されます。それらは「隠し」または「デフォルト」(詳細はhere)に設定することができます。これらの関数が動的テーブルにない場合、JNIはそれらを呼び出す関数を見つけることができないため、実行時にRegisterNatives呼び出しが失敗するようになります。
すべての関数はデフォルトでダイナミックテーブルになりますので、誰でも簡単にネイティブコードを逆コンパイルすることができます。 JNIがそれを見つける必要がある場合に備えて、すべての関数呼び出しがバイナリに組み込まれています。これは、コンパイラオプション-fvisibility
を使用して変更できます。私は誰もがこれを-fvisibility=hidden
に設定してコードを安全に保ち、JNIEXPORTを使用して外部可視性を持つ関数にフラグを立てることを推奨します。
stripコマンドを使用すると、デバッグシンボルが削除されるだけで、動的テーブルは分離されます。あなたの.soファイルからどれくらいの人が出ることができるかを見るために、objdumpで遊んでください。
最近、私たちはこれでうまくやってきました。これが誰かを助けてくれることを願っています。
編集:カスタムビルドシステムを使用しているため、他のビルド設定では表示オプションがデフォルトで設定されている可能性があります。詳細はthis SO answerでご覧になれます。簡単に言えば
JNICALLの意味は? – Lealo
JNICALLはアンドロイド上の空の定義です(上記と同じですが、プラットフォームの互換性のためにそこにあります)。 Windowsでは、JDK JNICALLは '__stdcall'(https://msdn.microsoft.com/en-us/library/zxk0tw93.aspx)として定義されています。 –