-1

到目前为止我所做的是:

将我的旧库(libold.so)放在 jni 文件夹中,并创建一个 Android.mk,其中包含:

LOCAL_PATH :=$(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE := libold 
LOCAL_SRC_FILES := libold.so 
include $(PREBUILT_SHARED_LIBRARY) 

之后,我运行 ndk-build 并使用 libold.so 创建一个新文件夹 /libs/armeabi。

看起来不错,但是当我运行它时,它可以找到我调用的方法。解决方案是将名称包更改为我之前使用的名称。

我究竟做错了什么?

4

2 回答 2

1

您在本机 .so 中的 JNI_OnLoad 例程针对其解析的方法设置了特定的 Java 包名称。如果您在解析本地方法的类(或多个类)上使用不同的包名称,则 VM 无法找到正确的方法,除非您的 JNI_OnLoad 知道如何区分并正确注册其本地方法。

如何更正这将取决于您首先如何注册本机,但有可能(即使有点复杂)让您的注册过程确定正在为哪个包完成加载并相应地注册方法。

于 2012-06-24T13:25:59.773 回答
0

您不能在 New Project 中直接使用已编译的库。对于不同的包名称,您的 c 文件中的相应函数签名将更改。

    JNIEXPORT jint JNICALL Java_com_package_class(JNIEnv *d, jobject e, jstring f) { 
//inside function

    }

您需要一个 jar,其中包含编译 so 文件的项目中的类,以调用 so 文件中的本机函数,以便新项目可以访问它。

于 2012-06-24T13:23:32.343 回答