AndroidNDKでcppファイルを使用する時の注意
TIPS本の内容を終えて、自分用のライブラリの作成を開始しました。
ライブラリの作成方法が3種類ほど掲載されていましたが、ライブラリのメンテナンス方法が(自分的に)楽そうな「Jar+共有ライブラリ」のやり方を選択することにしました。
この方法ではJNIの命名規則に沿った関数名をJAVA側のクラスでラッピングできるので汎用的だと思います。
PrebuiltLibraryは既存のC/C++ライブラリを導入する、またはnativeから呼び出す前提な場合に有用だと思います。
それでJarファイルと共有ライブラリを作成して、テストアプリでデバッグしてみたのですがうまく動作しません。
ログを見るとライブラリは読み込んでいるようですが、HelloWorldシンボルが読み込まれていません。
No implementation found for native Lnet/n2works/n2libs/N2Libs;.HelloWorld ()
どうやらcppでライブラリを作成したのでシンボル名がC++用にコンパイラ側で変換されていたようです。
「extern "C"」とすることで解決しました。
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT void JNICALL Java_net_n2works_n2libs_N2Libs_HelloWorld(JNIEnv *env, jclass clazz)
{
}
#ifdef __cplusplus
}
#endif