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

时间:2012-06-24 13:11:21

标签: android android-ndk

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

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

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

我做错了什么?

2 个答案:

答案 0 :(得分:1)

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

你如何纠正这取决于你如何首先注册本机,但是有可能(即使有点复杂)让你的注册过程确定负载正在进行哪个包并注册方法相应

答案 1 :(得分:0)

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

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

    }

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