到目前为止,我所做的是:
将我的旧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。
看起来很好但是当我运行它时可以找到我调用的方法。解决方案是更改我之前使用的名称包。
我做错了什么?
答案 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文件中的本机函数,以便新项目可以访问它。