gh-71052: Implement `ctypes.util.find_library` on Android (GH-116379)

This commit is contained in:
Malcolm Smith 2024-03-21 13:20:57 +00:00 committed by GitHub
parent d16c9d1278
commit 1f8b24ef69
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 36 additions and 2 deletions

View File

@ -1334,8 +1334,9 @@ Here are some examples::
'libbz2.so.1.0' 'libbz2.so.1.0'
>>> >>>
On macOS, :func:`~ctypes.util.find_library` tries several predefined naming schemes and paths On macOS and Android, :func:`~ctypes.util.find_library` uses the system's
to locate the library, and returns a full pathname if successful:: standard naming schemes and paths to locate the library, and returns a full
pathname if successful::
>>> from ctypes.util import find_library >>> from ctypes.util import find_library
>>> find_library("c") >>> find_library("c")

View File

@ -89,6 +89,15 @@ elif sys.platform.startswith("aix"):
from ctypes._aix import find_library from ctypes._aix import find_library
elif sys.platform == "android":
def find_library(name):
directory = "/system/lib"
if "64" in os.uname().machine:
directory += "64"
fname = f"{directory}/lib{name}.so"
return fname if os.path.isfile(fname) else None
elif os.name == "posix": elif os.name == "posix":
# Andreas Degert's find functions, using gcc, /sbin/ldconfig, objdump # Andreas Degert's find functions, using gcc, /sbin/ldconfig, objdump
import re, tempfile import re, tempfile

View File

@ -129,5 +129,28 @@ class FindLibraryLinux(unittest.TestCase):
self.assertIsNone(find_library("libc")) self.assertIsNone(find_library("libc"))
@unittest.skipUnless(sys.platform == 'android', 'Test only valid for Android')
class FindLibraryAndroid(unittest.TestCase):
def test_find(self):
for name in [
"c", "m", # POSIX
"z", # Non-POSIX, but present on Linux
"log", # Not present on Linux
]:
with self.subTest(name=name):
path = find_library(name)
self.assertIsInstance(path, str)
self.assertEqual(
os.path.dirname(path),
"/system/lib64" if "64" in os.uname().machine
else "/system/lib")
self.assertEqual(os.path.basename(path), f"lib{name}.so")
self.assertTrue(os.path.isfile(path), path)
for name in ["libc", "nonexistent"]:
with self.subTest(name=name):
self.assertIsNone(find_library(name))
if __name__ == "__main__": if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -0,0 +1 @@
Implement :func:`ctypes.util.find_library` on Android.