JNIEXPORT と JNICALL は NDK_ROOT/platforms/android-9/arch-arm/usr/include/jni.h で定義されています。セットアップに応じて、このパスは異なりますが、ほとんど同じです。
#define JNIIMPORT
#define JNIEXPORT __attribute__ ((visibility ("default")))
#define JNICALL
JNIEXPORT は、ビルドされたバイナリ (*.so ファイル) の動的テーブルにネイティブ関数を表示するために使用されます。それらは「非表示」または「デフォルト」に設定できます (詳細はこちら)。これらの関数が動的テーブルにない場合、JNI はそれらを呼び出す関数を見つけることができないため、RegisterNatives 呼び出しは実行時に失敗します。
すべての関数はデフォルトで動的テーブルに配置されるため、誰でも簡単にネイティブ コードを逆コンパイルできることに注意してください。JNI がそれを見つける必要がある場合に備えて、すべての関数呼び出しはバイナリに組み込まれています。これは、コンパイラ オプションを使用して変更できます-fvisibility
。コードを安全に保つためにこれを に設定し-fvisibility=hidden
、JNIEXPORT を使用して関数に外部可視性があることを示すフラグを設定することをお勧めします。
strip コマンドを使用すると、デバッグ シンボルが削除されるだけで、動的テーブルは分離されます。objdump を試して、あなたの .so ファイルからどれだけの情報が得られるかを確認してください。
私たちは最近これにつまずきました。これが誰かの助けになることを願っています。
編集: カスタム ビルド システムを使用しているため、可視性オプションはデフォルトで他のビルド設定に設定されている場合があります。詳細については、この SO answerを参照してください。