尝试加载预编译的.so Android NDK(Exception java.lang.UnsatisfiedLinkError:dlopen failed:library)

时间:2017-09-29 12:11:29

标签: java android android-ndk

我尝试构建一个Android项目(ndk-build)。

我想在我的项目中使用预编译库。 (libdemo.so)

Android.mk:

APP_STL := gnustl_static
APP_CPPFLAGS := -fexceptions
APP_ABI=armeabi armeabi-v7a

Application.mk:

LOCAL_PATH := $(call my-dir)
TARGET_ARCH_ABI := armeabi-v7a

include $(CLEAR_VARS)
LOCAL_MODULE := libdemo
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libdemo.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := native-lib
LOCAL_SRC_FILES := native-lib.cpp
LOCAL_SHARED_LIBRARIES := libdemo
include $(BUILD_SHARED_LIBRARY)

MainActivity:

android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    // Used to load the 'native-lib' library on application startup.
     static {
        System.loadLibrary("demo");
        System.loadLibrary("native-lib");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView tv = (TextView) findViewById(R.id.sample_text);
        Log.d("TAG", stringFromJNI());
    }

    /**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     */
    public native String stringFromJNI();
}

但是我在构建时遇到以下异常:

java.lang.UnsatisfiedLinkError: dlopen failed: library "/Users/John/Documents/Apps/LibTest/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/libdemo.so" not found

该文件存在于提供的路径中。我认为道路根本不正确。 为什么我的台式机有路径?我的设备应该有路径吗?

有人在这里帮忙吗? 感谢

2 个答案:

答案 0 :(得分:0)

我自己解决了这个问题。

我不知道ndk-build没有自动处理。 我去了我的项目文件夹(存在jni的文件夹)并手动进行ndk-build。

之后,libs将自动编译并复制到/ libs文件夹中。

现在只需像往常一样构建并运行应用程序,一切都很好。

答案 1 :(得分:0)

就我而言,这是由于所生成的共享库上缺少SONAME标记引起的。如果缺少此标记,则Android构建过程将使用库的绝对路径,而不是设备特定的路径。

必须通过链接器的-soname-install_name(特定于macOS)参数显式指定SONAME。

例如,如https://github.com/golang/go/issues/17807\#issuecomment-259930881中所述,当从Go源代码构建共享库时可能会发生这种情况。