导入*.so库的总结

按照常用方法导入失败,版本过低,需要降低NDK版本,并且还会出现各种问题。

原先的方法:

在这里插入图片描述在这里插入图片描述


问题1:

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file***] couldn't find "libserial_port.so"

解决:

在这里插入图片描述


问题2:

/lib/arm/libserial_port.so: has text relocations	

解决:

1、在Android.mk文件中加入:LOCAL_LDFLAGS += -fPIC
在这里插入图片描述
2、重新编译Google开源库的源码,生成.so库

  1. 在这里插入图片描述在这里插入图片描述

  2. 在这里插入图片描述
    从而需要修改build.gradle文件
    在这里插入图片描述

  3. 将生成的lib下的文件复制到libs文件夹下(生成文件的位置通过文件搜索libserial_port.so即可找到)
    在这里插入图片描述
    在这里插入图片描述


问题3:

java.lang.UnsatisfiedLinkError: No implementation found for java.io.FileDescriptor com.example.test.android_serialport_api.SerialPort.open(java.lang.String, int, int) (tried Java_com_example_test_android_1serialport_1api_SerialPort_open and Java_com_example_test_android_1serialport_1api_SerialPort_open__Ljava_lang_String_2II)

解决:

在这里插入图片描述
注意! 我们自己的包名和demo 包名不一致,从而需要新建android_serialport_api这个包,把SerialPort.java等文件放入
在这里插入图片描述


以上解决方法参考文章如下:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
android驱动源代码 package android.serialport; import java.io.File; import java.io.FileDescriptor; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import android.util.Log; public class SerialPort { private static final String TAG = "SerialPort"; /* * Do not remove or rename the field mFd: it is used by native method close(); */ private FileDescriptor mFd; private FileInputStream mFileInputStream; private FileOutputStream mFileOutputStream; public SerialPort(File device, int baudrate) throws SecurityException, IOException { /* Check access permission */ if (!device.canRead() || !device.canWrite()) { try { /* Missing read/write permission, trying to chmod the file */ Process su; su = Runtime.getRuntime().exec("/system/bin/su"); /*String cmd = "chmod 777 " + device.getAbsolutePath() + "\n" + "exit\n";*/ String cmd = "chmod 777 /dev/s3c_serial0" + "\n" + "exit\n"; su.getOutputStream().write(cmd.getBytes()); if ((su.waitFor() != 0) || !device.canRead() || !device.canWrite()) { throw new SecurityException(); } } catch (Exception e) { e.printStackTrace(); throw new SecurityException(); } } mFd = open(device.getAbsolutePath(), baudrate); if (mFd == null) { Log.e(TAG, "native open returns null"); throw new IOException(); } mFileInputStream = new FileInputStream(mFd); mFileOutputStream = new FileOutputStream(mFd); } // Getters and setters public InputStream getInputStream() { return mFileInputStream; } public OutputStream getOutputStream() { return mFileOutputStream; } // JNI private native static FileDescriptor open(String path, int baudrate); public native void close(); static { System.loadLibrary("serial_port"); } }
Django是一个基于Python的Web开发框架,主要用于快速构建功能强大的Web应用程序。编译.so是将Python代码转换为可执行的共享对象(Shared Object Library)的过程,可以提高代码运行效率和程序性能。 在Django中,通常不需要对Python代码进行单独的.so编译。因为Django的核心功能已经使用C语言编写的Cython扩展实现,这些扩展会在Django模块被导入时自动加载。这些Cython扩展已经编译为共享对象,并与Django一起分发。 不过,在某些情况下,你可能需要编译自己的.so来提高某些特定功能的性能。为了实现这一点,你可以使用Cython将Python代码编译为C语言代码,然后使用GCC等编译器将C语言代码编译为.so。 首先,你需要安装Cython和GCC等编译工具。然后,将Python代码保存为一个Cython模块(文件后缀为.pyx),使用Cython命令将其编译成C语言代码(文件后缀为.c)。接下来,使用GCC等编译器将C语言代码编译为.so。 编译.so的过程相对复杂,需要一定的开发经验和知识。因此,在大多数情况下,我们建议使用Django提供的已编译的Cython扩展,以确保代码的性能和稳定性。 总结来说,对于Django的大部分开发者来说,不需要手动编译.so。Django使用Cython扩展提供了高性能和稳定性,可以满足大部分的Web应用需求。只有在特定需求下,才需要手动编译.so来提高特定功能的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值