Android 在新项目中重用生成的.so共享库

Android 在新项目中重用生成的.so共享库,android,android-ndk,Android,Android Ndk,到目前为止,我所做的是: 将我的旧库(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/arme

到目前为止,我所做的是:

将我的旧库(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

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


我做错了什么?

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

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

    }

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

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


你如何纠正这一点将取决于你一开始是如何登记当地人的,但这是可能的(即使有点复杂)让您的注册过程确定加载的是哪个包,并相应地注册方法。

NDK库中的本机方法实现都包含Java包名称(如
Java\u com\u myapp\u MyClass\u MyMethod()
)。确保在新项目中,包装Java类位于同一个包中(示例中为com.myapp)。我不知道如何注册bcz不是我库有多疯狂。但是,我想更改包名并使用不同的名称…如果您没有源代码来重建库,则必须为需要库的类使用相同的java包名。您仍然可以使用不同的APK包名称,只要使用本机方法的一个类保留与.so.so.so一致的包名称,使用android.mk prebuild时不做任何更改??:s@user1477414这是正确的。从理论上讲,使用十六进制编辑器是可能的,但不是普遍推荐的,也不是所有情况下都简单。