私のアプリケーションに2つのネイティブライブラリ(.so)を統合しました。ライブラリはうまくコンパイルされ、アプリケーションにロードすることもできます。ライブラリのネイティブメソッドを初めて呼び出すときは正常に動作しますが、アクティビティで同じメソッドを再度呼び出すと、アプリケーションがシャットダウンします。ここで述べたように、私が直面していますアクティビティで第三者ライブラリのネイティブメソッドを2回呼び出すと、Androidアプリケーションが終了します
問題はまったく同じです:
http://grokbase.com/t/gg/android-ndk/1226m68ydm/app-exit-on-second-native-call
(0) 。記事の後、私は成功した操作の後に、呼び出されたメソッドのNULLにポインタを設定しようとしましたが、これも私を助けませんでした。また、System.loadLibrary()によって読み込まれたライブラリをアンロードすることもできません。
新しいアクティビティを作成せずにネイティブメソッドを複数回呼び出す必要があります。任意のアイデアはどのようにこの問題を解決するには?
(私は最終的に解決策を見つけた...ここにある)
さて、私はこの問題を解決する方法をついに発見しました。解決策は実際には非常に簡単です。別の独立したネイティブライブラリ(ユーティリティライブラリ)をビルドして、他のライブラリをロードおよびアンロードします。私たちがする必要があるのは、ユーティリティのネイティブメソッドでdlopen()とdlclose()を使うことです。 System.loadLibrary()を介して以前と同様にユーティリティライブラリを読み込むことができます。
は、だから我々は何をする必要があるかユーティリティライブラリのネイティブメソッドである:
使用#include <dlfcn.h>
//これは、dlopenを呼び出すために必要です()とdlcloseの()関数。
ハンドラと機能のプロトタイプを提供します
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);
これは、他の人が同じ問題に直面するのに役立ちます。
dlclose(ハンドル)はどこですか?アクティビティコードまたはJNIコードの意味ですか? –
そのJNIコードです。これは、dlfcn.hヘッダーファイルで使用できる関数です。 – ZakiMak
それを得ました、私はあなたがこのcクラスの他のライブラリをロードしてアンロードするのを見ます。しかし、どのように私はJavaコードにリンクする必要がありますか? –