2

1 つのネイティブ ライブラリを複数のアプリケーションで使用したい。ライブラリは Android ビルド システムを介してコンパイルされ、現在 /system/lib/ に配置されています。System.LoadLibrary("libexample") を介してアプリケーションにロードできます。しかし、次のように宣言する必要があるライブラリ内のメソッド

JNIEXPORT jstring JNICALL Java_application1_MainActivity_method1

ライブラリは複数のアプリケーションで使用する必要があるため、使用できません。もちろん、このいくつかのアプリケーションには独自の名前が付いています。だから私は自分のメソッドに同じように名前を付けようとしました

 JNIEXPORT jstring JNICALL method1

そして電話する

public native String method1(String string);

しかしもちろん、私のアプリケーションは Java_application1_MainActivity_method1 としてそれを見つけようとしています

このメソッドを呼び出す方法、またはどのように名前を付ける必要がありますか?

更新しました:

私はこのチュートリアルを使用してプロジェクトを完成させようとしました。ネイティブメソッドを使用するためのライブラリを作成しました:

package com.example.mylib;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MyClass extends Activity {
public native static String MyMethod(String string);
    static {
        System.loadLibrary("nativeLibrary");
    }
}

次に、アプリケーションでそれを使用しようとしています:

// Some no interesting inclusions
import com.example.mylib.MyClass;

public class MainActivity extends ListActivity {
// Some no interesting code.
MyMethod(file.getAbsolutePath())
//Some no interesting code 
}

そして、それは私が必要とするように働いています! しかし今、私はインポート com.example.mylib.MyClass;を混乱させました。日食では「 使用されたことはありません」。そして、この「 Is Library 」プロジェクトでイメージを作成すると、最新のものは解決されません。何か案が?

4

1 に答える 1

1

はい、多くのアプリケーションで同じ JNI 署名を使用できます。AndroidManifest.xml で定義されているように、クラスがアプリケーションのデフォルト パッケージに属していない可能性があります。だから何?


例:

NDK の HelloJni サンプルから始めます (Eclipse では、[インポート] -> [Android] -> [既存の Android コード] を使用し、${android-ndk-root}/samples/hello-jni をポイントします)。

ビルドして、デバイスまたはエミュレーターで実行します。

新しい Android アプリケーション プロジェクトを開き、TestCrossJni という名前を付けます。アプリのパッケージ名は次のようになります: test.cross.jni - com.example.hellojni!とは関係ありません。

「アクティビティの作成」を選択 -> 空のアクティビティを作成します。

このプロジェクトに新しい Java クラスを追加します ( src/com/example/hellojni/HelloJni.java):

package com.example.hellojni;

public class HelloJni
{
    public static String gets() {
        return stringFromJNI();
    }

    /* A native method that is implemented by the
     * 'hello-jni' native library, which is packaged
     * with this application.
     */
    private native String  stringFromJNI();

    /* this is used to load the 'hello-jni' library on application
     * startup. The library has already been unpacked into
     * /data/data/com.example.hellojni/lib/libhello-jni.so at
     * installation time by the package manager.
     */
    static {
        System.load("/data/data/com.example.hellojni/lib/libhello-jni.so");
    }
}

編集res/layout/activity_main.xml:置き換え

    12行目android:text="@string/hello_world" />

    とandroid:id="@+id/hello_world" />

の後に次src/test/cross/jni/MainActivity.javaを追加します。

    12行目setContentView(R.layout.activity_main);

((android.widget.TextView)findViewById(R.id.hello_world)).setText(com.example.hellojni.HelloJni.gets());

利益!

于 2013-07-11T15:49:45.940 に答える