2

我想为多个应用程序使用一个本机库。库已通过 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 
}

它可以按我的需要工作!但现在我很困惑我的import com.example.mylib.MyClass; 在 Eclipse 中 “从未使用过”。如果我用这个“ Is Library ”项目创建图像,最新的将无法解决。任何的想法?

4

1 回答 1

1

是的,您可以在许多应用程序中使用相同的 JNI 签名。您的类可能不属于 AndroidManifest.xml 中定义的应用程序的默认包。所以呢?


例子:

从 NDK 中的 HelloJni 示例开始(在 Eclipse 中,使用 Import -> Android -> existing Android Code,并指向 ${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 回答