将项目 api 级别 21 降低到 19 时出现 NDK UnsatisfiedLinkError
NDK UnsatisfiedLinkError when lowering project api level 21 to 19
我使用 api 级别 21 的 ndk 制作项目。但由于某些原因,我将项目 api 级别 21 降级为 19。
我的项目在 api 21 中运行良好,但在降级后我的项目在 NDK 部分出现错误。
这是我的项目运行时的错误代码System.loadLibrary("serial_port");.
AndroidRuntime: java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "tcgetattr" referenced by "libserial_port.so"...
AndroidRuntime: at java.lang.Runtime.loadLibrary(Runtime.java:364)
AndroidRuntime: at java.lang.System.loadLibrary(System.java:526)
AndroidRuntime: at com.josh.mainSelection.UartUI.onCreate(UartUI.java:220)
AndroidRuntime: at android.app.Activity.performCreate(Activity.java:5231)
AndroidRuntime: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148)
AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
AndroidRuntime: at android.app.ActivityThread.access0(ActivityThread.java:135)
AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:102)
AndroidRuntime: at android.os.Looper.loop(Looper.java:136)
AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5001)
AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method)
AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:515)
AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:811)
AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:627)
AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)
我是第一次使用 NDK,我无法解决问题。
请帮我解决错误。
我正在使用 gradle-experimental:0.4.0.
我不知道为什么会这样。但是在删除我项目中的所有 .so 文件并重建之后,它可以正常工作而没有任何错误。我认为在 api 级别 21 中创建的 .so 文件不知何故崩溃了。
这让我抓狂。
我的compileSdkVersion
23
不过我刚刚解决了
您可以看到 termios.h
文件在 API 19 和 21+ 之间的差异。
所以,我将 termios.h
从 D:\Android\Sdk\ndk-bundle\platforms\android-19\arch-arm\usr\include
复制到 jni
文件夹,然后就可以了。
我使用 api 级别 21 的 ndk 制作项目。但由于某些原因,我将项目 api 级别 21 降级为 19。
我的项目在 api 21 中运行良好,但在降级后我的项目在 NDK 部分出现错误。
这是我的项目运行时的错误代码System.loadLibrary("serial_port");.
AndroidRuntime: java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "tcgetattr" referenced by "libserial_port.so"...
AndroidRuntime: at java.lang.Runtime.loadLibrary(Runtime.java:364)
AndroidRuntime: at java.lang.System.loadLibrary(System.java:526)
AndroidRuntime: at com.josh.mainSelection.UartUI.onCreate(UartUI.java:220)
AndroidRuntime: at android.app.Activity.performCreate(Activity.java:5231)
AndroidRuntime: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148)
AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
AndroidRuntime: at android.app.ActivityThread.access0(ActivityThread.java:135)
AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:102)
AndroidRuntime: at android.os.Looper.loop(Looper.java:136)
AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5001)
AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method)
AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:515)
AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:811)
AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:627)
AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)
我是第一次使用 NDK,我无法解决问题。 请帮我解决错误。
我正在使用 gradle-experimental:0.4.0.
我不知道为什么会这样。但是在删除我项目中的所有 .so 文件并重建之后,它可以正常工作而没有任何错误。我认为在 api 级别 21 中创建的 .so 文件不知何故崩溃了。
这让我抓狂。
我的compileSdkVersion
23
不过我刚刚解决了
您可以看到 termios.h
文件在 API 19 和 21+ 之间的差异。
所以,我将 termios.h
从 D:\Android\Sdk\ndk-bundle\platforms\android-19\arch-arm\usr\include
复制到 jni
文件夹,然后就可以了。