编辑:请参见我的第一个答案。
我想在我的项目中使用Android串口API。但我遇到了很多麻烦。关于如何配置旧版本的gradle或如何使用NDK编译有大量相互冲突的信息,这两者都没有用处。我完全迷失了方向。
唯一我找到的可能正确的步骤如下:
进展 #1. 我将 libserial_port.so
放置在 src/main/jnilibs/armeabi
中。当我将其作为 zip 文件打开时,它出现在 apk 中。
但是我该如何告诉编译器使用此库?如何告诉它将其包含在项目输出中?我如何引用此库中的方法?(有一个 SerialPort.c
和一个 SerialPort.h
)。这些 .mk 文件应该放在哪里?
我有一种感觉,似乎是我错过了每个人都认为理所当然的一些信息。在api示例中也没有对本地库的引用。
进展 #2:在我的代码中,我尝试使用以下方式加载库:
System.loadLibrary("libserial_port");
但是这行代码会抛出 UnsatisfiedLinkError 异常。
Native code library failed to load.java.lang.UnsatisfiedLinkError: Couldn't load libserial_port from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/myapp.apk"],nativeLibraryDirectories=[/data/app-lib/myapp.apk, /vendor/lib, /system/lib]]]: findLibrary returned null
进展#3:连接器不支持带下划线的库名称。
进展#4:连接器假定具有lib前缀。您应该在loadlibrary命令中省略它。
现在我调用System.loadLibrary(“serialport”); 并且我的库名为libserialport.so。现在我不再收到UnsatisfiedLinkError错误!
现在我们开始了解如何引用库中的方法。