アプリケーションに 2 つのネイティブ ライブラリ (.so) を統合しました。ライブラリは正常にコンパイルされ、アプリケーションにもロードできます。ライブラリのネイティブ メソッドを初めて呼び出すときは正常に動作しますが、アクティビティで同じメソッドを再度呼び出すと、アプリケーションがシャットダウンします。
私が直面している問題は、ここで言及されているものとまったく同じです:
http://grokbase.com/t/gg/android-ndk/1226m68ydm/app-exit-on-second-native-call
有効な解決策は、別のアクティビティでネイティブ メソッドを呼び出し、System.exit(0) を介して強制的にシャットダウンすることです。記事に従って、操作が成功した後、呼び出されたメソッドのポインターを NULL に設定しようとしましたが、これも役に立ちませんでした。また、System.loadLibrary() によってロードされたライブラリをアンロードすることはできません。
新しいアクティビティを作成せずにネイティブ メソッドを複数回呼び出したい。この問題を解決する方法はありますか?
(私は最終的に解決策を見つけました...ここにあります)
さて、私はついにこの問題を解決する方法を見つけました。解決策は実際には非常に簡単です。別の独立したネイティブ ライブラリ (ユーティリティ ライブラリ) を構築して、他のライブラリをロードおよびアンロードします。必要なことは、ユーティリティのネイティブ メソッドで dlopen() と dlclose() を使用することです。以前のように、System.loadLibrary() を介してユーティリティ ライブラリをロードできます。
したがって、ユーティリティ ライブラリのネイティブ メソッドでは、次のことを行う必要があります。
// これは、dlopen() およびdlclose #include <dlfcn.h>
() 関数を呼び出すために必要です。
ハンドラーと関数のプロトタイプを提供します。
void *handle;
typedef int (*func)(int); // define function prototype
func myFunctionName; // some name for the function
dlopen() でライブラリを開きます:
handle = dlopen("/data/data/my.package.com/lib/somelibrary.so", RTLD_LAZY);
ライブラリの関数を取得して呼び出します。
myFunctionName = (func)dlsym(handle, "actualFunctionNameInLibrary");
myFunctionName(1); // passing parameters if needed in the call
これで通話は完了です。dlclose() で閉じます:
dlclose(handle);
これが同じ問題に直面している他の人に役立つことを願っています。