-
背景
项目中要将C++上面的部分代码转到Android中使用,所以使用C++编译成so库的方式 -
遇到的问题
1 首先写C++的同事站在他的立场上没有考虑Java调用的入口问题,所以我们走了一些弯路,最直接的例子:
错误代码:
/*此简单函数返回平台 ABI,此动态本地库为此平台 ABI 进行编译。*/
const char * testAndroidso::hello()
{
#if defined(__arm__)
#if defined(__ARM_ARCH_7A__)
#if defined(__ARM_NEON__)
#define ABI "armeabi-v7a/NEON"
#else
#define ABI "armeabi-v7a"
#endif
#else
#define ABI "armeabi"
#endif
#elif defined(__i386__)
#define ABI "x86"
#else
#define ABI "unknown"
#endif
LOGI("This dynamic shared library is compiled with ABI: %s", ABI);
return "hello chen!";
}
正确代码
Java_com_xnqq_LoadSoLib_hello(
JNIEnv* env,
jobject /* this */) {
#if defined(__arm__)
#if defined(__ARM_ARCH_7A__)
#if defined(__ARM_NEON__)
#define ABI "armeabi-v7a/NEON"
#else
#define ABI "armeabi-v7a"
#endif
#else
#define ABI "armeabi"
#endif
#elif defined(__i386__)
#define ABI "x86"
#else
#define ABI "unknown"
#endif
std::string hello = "hello chen!";
return env->NewStringUTF(hello.c_str());
}
其中
Java_com_xnqq_LoadSoLib_hello是必须要写的,提供给Java调用的
return中必须要在env的回调中去返回值
可能这个问题在老手中不算是个问题,但是同事是第一次做给Android提供so库,很小的问题也是个问题
2 关于Android 中的v7a架构中libc++_shared.so文件缺失问题:
关于这个so文件可以再ndk中找到
D:\DEV\AS\sdk\ndk\21.1.6352462\sources\cxx-stl\llvm-libc++\libs\armeabi-v7a