Android — 關於Native的一些STL問題

JLin
Aug 25, 2021

--

如果有遇到

In instantiation of template class 'std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> >' failed requirement '__is_allocator<std::__ndk1::allocator<char>, void, void>::value'; 'enable_if' cannot be used to disable this declaration

這可能是引用的.a檔或者是build出來的.a裡面的某個型態是使用不同的STL_TYPE

譬如gnustl_shared或是c++_shared

gnustl是std::basic_string

libc++是std::__ndk1::basic_string

libbase是std::__1::basic_string (android)

其中有人提到再build.gradle的arguments當中增加 (後來是發現這個方法才會有效)

externalNativeBuild.cmake{
arguments “-DANDROID_STL=c++_shared”
}

或是再cppFlags

externalNativeBuild {
cmake {
cppFlags "-DANDROID_STL=c++_shared"
abiFilters "armeabi-v7a","arm64-v8a"
}
}

也有人提到再CMakeList中增加(不過實際測試這不會自己產生再android aar中)

set(CMAKE_ANDROID_STL_TYPE "c++_shared")

官網-關於Cmake怎麼運作

https://developer.android.com/ndk/guides/cmake#android_stl

而這邊也有官方文件講到STL比較詳細的部分

https://developer.android.com/ndk/guides/cpp-support.html

以上,後來雖然發現問題不是stl的問題,不過還是隨手整理一下這次查到的資料,也許以後有機會參考

參考

--

--

JLin

台中人 @ Taipei , Android /Kotlin / Kotlin Native / KMM / Compose