我尝试构建一个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
该文件存在于提供的路径中。我认为道路根本不正确。 为什么我的台式机有路径?我的设备应该有路径吗?
有人在这里帮忙吗? 感谢
答案 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源代码构建共享库时可能会发生这种情况。