7

Android NDK フォルダーの「native-activity」サンプル プロジェクトに基づいて、Android-10 NDK ネイティブ アクティビティを構築しようとしています。ただし、Eclipse を開いてプロジェクトの [Run As -> Android Application] を選択すると、ネイティブ アクティビティが次のランタイム例外でクラッシュします。

02-09 03:02:12.599: E/AndroidRuntime(881): java.lang.RuntimeException: アクティビティ ComponentInfo を開始できません{com.example.native_activity/android.app.NativeActivity}: java.lang.IllegalArgumentException: ロードできませんネイティブ ライブラリ: /data/app-lib/com.example.native_activity-1/[ライブラリ名].so

しかし、「libs/armeabi」などのパスに「lib[ライブラリ名].so」というファイルが既に存在することを確認しました。私のネイティブ アクティビティは最終的に 3 つの「.so」ファイルをロードする必要がありますが、1 つの「.so」ファイルをロードしようとしても、3 つの「.so」ファイルすべてをロードしようとしても、このエラーは解決しません。私の「AndroidManifest.xml」ファイルは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<!-- BEGIN_INCLUDE(manifest) -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.native_activity"
    android:versionCode="1"
    android:versionName="1.0">

<!-- This is the platform API where NativeActivity was introduced. -->
<uses-sdk android:minSdkVersion="9" />

<!-- This .apk has no Java code itself, so set hasCode to false. -->
<application android:label="@string/app_name" android:hasCode="false">

    <!-- Our activity is the built-in NativeActivity framework class.
         This will take care of integrating with our NDK code. -->
    <activity android:name="android.app.NativeActivity"
            android:label="@string/app_name"
            android:configChanges="orientation|keyboardHidden">
        <!-- Tell NativeActivity the name of or .so -->
        <meta-data android:name="android.app.lib_name"
            android:value="[library name]" />
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

</manifest> 
<!-- END_INCLUDE(manifest) -->

この実行時例外を修正するには、何をする必要がありますか?

4

4 に答える 4

2

ロードの失敗に関する詳細情報を見つける便利な方法は、基本的な Android アプリケーションを作成し、NativeActivity を完全にバイパスしてSystem.loadLibrary、メソッドでネイティブ ライブラリをロードするために使用することです。onCreate

例えば

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    System.loadLibrary("foo");
    System.loadLibrary("bar");
    System.loadLibrary("depends-on-foo-and-bar");
}

次に、NativeActivity が提供するあまり役に立たない「ネイティブ ライブラリをロードできません」というメッセージを取得する代わりに、次のようなより有用なメッセージを取得します。

java.lang.UnsatisfiedLinkError: dlopen に失敗しました: "libdepends-on-foo-and-bar.so" が必要とするライブラリ "lib42.so" を読み込めませんでした。ライブラリ「lib42.so」が見つからないことが原因

于 2015-05-29T22:12:47.263 に答える
1

JNI フォルダで "" は何に設定されていますか? 「[ライブラリ名]」の名前は、ビルドするパッケージの名前として設定する必要があります。

于 2013-03-23T11:23:58.150 に答える