0

Ok..

.a とメイン アプリケーションを介して .so ファイルを読み取る際に問題があります。

私のメイン コンソール アプリケーションには .a スタティック ライブラリ ファイルが含まれており、.a スタティック ライブラリ ファイル内の関数は dlopen() 関数を使用して .so ファイルを読み取ります。

私の .so プロジェクトは、JNI を使用して Java ソース コードを呼び出す共有オブジェクトです。うまくコンパイルされ、.so ファイルが生成されます。

私の .a プロジェクトは、関数 dlopen() を使用して .so ファイルを読み取ることです。うまくコンパイルされ、.a ファイルが生成されます。

しかし、dlopen()関数で止まってしまいました。私の .so ファイルへのポインタを取得しません。dlerror() を使用してエラーが表示されると、次のように表示されます。

"fail to dlopen, libjvm.so: cannot open shared object file: No such file or directory"

LD_LIBRARY_PATH を正しく設定しました。それが、JNI を実装する .so プロジェクトが非常にうまくコンパイルされた理由だと思います。この .so プロジェクトに JDK の正しいインクルードとライブラリ パスを含めました。

私は Ubuntu 64 ビットを使用しており、Netbeans IDE を使用してすべてのコンソール、.a、.so プロジェクト (合計 3 つのプロジェクト) に取り組んでいます。

しかし興味深いことに、単純な C プログラムでその .so ファイルを読み込もうとすると、非常にうまく読み取れます。

以下の独立した単純な C プログラムが私の .so ファイルを読み取ることができるのに、メイン プロジェクトのコンソール アプリケーションが .a ファイルを介して読み取ることができない理由がわかりません。

これがその単純な c プログラムのソース コードです。

#include <stdio.h>
#include <dlfcn.h>


int main(int argc, char **argv)
{
    void *handle = NULL;
    int (*result)(int, int);

    handle = dlopen("/home/online0227/desktop/runDynamic/myso.so", RTLD_LAZY);
    if ( !handle )
    { 
        printf("fail to dlopen, %s\n", dlerror());
        return 0;
    } else {
printf("succeeded1111\n");
}


    dlclose(handle);
    return 0;
}

以下は、この単純な C プログラムをコンパイルして実行するために入力したものです。

gcc -o main main.c -ldl
./main
4

2 に答える 2

0

暗闇の中でのショット: libjvm.so は、見つからない/開くことができない別の .so ファイルに依存している可能性があります。

実行してみてください:

ldd libjvm.so
于 2013-08-26T19:24:28.150 に答える