mirror of https://github.com/python/cpython
gh-71052: Implement `ctypes.util.find_library` on Android (GH-116379)
This commit is contained in:
parent
d16c9d1278
commit
1f8b24ef69
|
@ -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")
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Implement :func:`ctypes.util.find_library` on Android.
|
Loading…
Reference in New Issue