如何在Android设备中用NDK编译SQLite并且对SQLite进行操作
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Android设备中用NDK编译SQLite并且对SQLite进行操作相关的知识,希望对你有一定的参考价值。
参考技术ASQLite是轻量级嵌入式数据库引擎,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。此外它还是开源的,任何人都可以使用它。许多开源项目((Mozilla, php, Python)都使用了 SQLiteSQLite 由以下几个组件组成:SQL 编译器、内核、后端以及附件。SQLite 通过利用虚拟机和虚拟数据库引擎
(VDBE),使调试、修改和扩展 SQLite 的内核变得更加方便。
1. android 集成了 SQLite 数据库 Android 在运行时(run-time)集成了 SQLite,所以每个 Android 应用程序都可以使用 SQLite 数据库。
2. 数据库存储在 data/< 项目文件夹 >/databases/ 下。 Android 开发中使用 SQLite 数据库 Activites 可以通过 Content Provider 或者 Service 访问一个数据库。
3. Android 提供了 SQLiteOpenHelper 创建一个数据库,只要继承 SQLiteOpenHelper 类,就可以轻松的创建数据库。SQLiteOpenHelper 类根据开发应用程序的需要,封装了创建和更新数据库使用的逻辑。
4. SQLiteOpenHelper 的子类,至少需要实现三个方法:
构造函数,调用父类 SQLiteOpenHelper 的构造函数。这个方法需要四个参数:上下文环境(例如,一个 Activity),数据库名字,一个可选的游标工厂(通常是 Null),一个代表你正在使用的数据库模型版本的整数。
2.onCreate()方法,它需要一个 SQLiteDatabase 对象作为参数,根据需要对这个对象填充表和初始化数据。
3.onUpgrage() 方法,它需要三个参数,一个 SQLiteDatabase 对象,一个旧的版本号和一个新的版本号,这样就可以清楚如何把一个数据库从旧的模型转变到新的模型。
本回答被提问者采纳在Linux环境下使用NDK编译FFmpeg
在Linux环境下使用NDK编译FFmpeg
- 本教程讲解如何在Linux系统中使用NDK编辑FFmpeg动态链接库
- NDK:Native Development Kit,是 Android 的一个工具开发包
- NDK 提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库
- NDK 能自动将 so(动态链接库)和 java 应用一起打包成 apk(应用程序包)
- JNI:Java Native Interface,它提供若干的 API 实现 Java 与其他语言之间的通信
- JNI:可以在 Android 中使用 JNI 来调用 FFmpeg 的 so(动态链接库)
- 该动态链接库可以运行在 ARM(armv8-a、armv7-a、x86、x86-64)架构中。
1)编译前的准备工作
- Ubuntu 18.04 X64(系统)
- apt-get install yasm
- apt-get install pkg-config
- Android NDK(下载)
- android-ndk-r20b-linux-x86_64.zip
- https://developer.android.google.cn/ndk/downloads/
- FFmpeg(下载)
- http://ffmpeg.org/download.html#releases
- 在 FFmpeg 中使用 h264_mediacodec 建议版本 3.4.7
2)开始使用NDK编译FFmpeg
- 解码 android-ndk-r20b-linux-x86_64.zip 到 /home/nljb/
- 解压 ffmpeg-4.2.4.tar.gz 到 /home/nljb/
- 修改 /home/nljb/ffmpeg-4.2.4/configure 文件 …
// 原始内容
SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR)$(SLIBNAME)'
// 修改为
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
- 创建 /home/nljb/ffmpeg-4.2.4/build.sh 文件
- 执行 sh -x build.sh 即可开始编译 ……
- 如出现 asm 异常则增加(–disable-asm)即可
- 编译完成后可以在 $(pwd)/android/$CPU 查看结果
#!/bin/bash
make clean
export NDK=/home/nljb/android-ndk-r20b
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64/
API=21
function build_android
{
echo "Compiling FFmpeg for $CPU"
./configure \\
--prefix=$PREFIX \\
--enable-neon \\
--enable-hwaccels \\
--enable-gpl \\
--enable-shared \\
--enable-jni \\
--enable-mediacodec \\
--disable-decoders \\
--enable-decoder=h264_mediacodec \\
--enable-decoder=vp9 \\
--enable-decoder=h264 \\
--enable-decoder=mpeg4 \\
--enable-decoder=aac \\
--enable-decoder=aac_latm \\
--enable-decoder=mjpeg \\
--enable-decoder=png \\
--enable-decoder=mpeg4_mediacodec \\
--disable-encoders \\ // 按需开启
--enable-encoder=vp9_vaapi --enable-encoder=h264_nvenc --enable-encoder=h264_v4l2m2m --enable-encoder=hevc_nvenc \\
--disable-demuxers \\ // 按需开启
--enable-demuxer=rtsp --enable-demuxer=rtp --enable-demuxer=flv --enable-demuxer=h264 \\
--disable-muxers \\ // 按需开启
--enable-muxer=rtsp --enable-muxer=rtp --enable-muxer=flv --enable-muxer=h264 \\
--disable-parsers \\ // 按需开启
--enable-parser=mpeg4video --enable-parser=aac --enable-parser=h264 --enable-parser=vp9 \\
--disable-protocols \\ // 按需开启
--enable-protocol=rtmp --enable-protocol=rtp --enable-protocol=tcp --enable-protocol=udp \\
--disable-bsfs \\
--disable-indevs --enable-indev=v4l2 \\
--disable-outdevs \\
--disable-filters \\
--disable-postproc \\
--disable-static \\
--disable-doc \\
--disable-ffmpeg \\
--disable-ffplay \\
--disable-ffprobe \\
--enable-avdevice \\
--disable-doc \\
--disable-symver \\
--cross-prefix=$CROSS_PREFIX \\
--target-os=android \\
--arch=$ARCH \\
--cpu=$CPU \\
--cc=$CC \\
--cxx=$CXX \\
--enable-cross-compile \\
--sysroot=$SYSROOT \\
--extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \\
--extra-ldflags="$ADDI_LDFLAGS" \\
$ADDITIONAL_CONFIGURE_FLAG
make clean
make -j6
make install
echo "The Compilation of FFmpeg for $CPU is completed"
}
#armv8-a
ARCH=arm64
CPU=armv8-a
CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=$CPU"
build_android
#armv7-a
ARCH=arm
CPU=armv7-a
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
build_android
#x86
ARCH=x86
CPU=x86
CC=$TOOLCHAIN/bin/i686-linux-android$API-clang
CXX=$TOOLCHAIN/bin/i686-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/i686-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"
build_android
#x86_64
ARCH=x86_64
CPU=x86-64
CC=$TOOLCHAIN/bin/x86_64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/x86_64-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/x86_64-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=$CPU -msse4.2 -mpopcnt -m64 -mtune=intel"
build_android
#!/bin/bash
export NDK=/root/android-ndk-r20b
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64/
API=21
#armv7-a
ARCH=arm
CPU=armv7-a
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU -DBIONIC_IOCTL_NO_SIGNEDNESS_OVERLOAD"
echo "Compiling FFmpeg for $CPU"
./configure \\
--prefix=$PREFIX \\
--disable-asm \\
--enable-neon \\
--enable-hwaccels \\
--enable-shared \\
--enable-jni \\
--enable-mediacodec \\
--enable-decoders \\
--disable-encoders \\
--enable-demuxers \\
--enable-muxers \\
--enable-parsers \\
--enable-protocols \\
--disable-bsfs \\
--disable-indevs \\
--disable-outdevs \\
--disable-filters \\
--disable-postproc \\
--disable-static \\
--disable-doc \\
--disable-ffmpeg \\
--disable-ffplay \\
--disable-ffprobe \\
--enable-avdevice \\
--disable-doc \\
--disable-symver \\
--cross-prefix=$CROSS_PREFIX \\
--target-os=android \\
--arch=$ARCH \\
--cpu=$CPU \\
--cc=$CC \\
--cxx=$CXX \\
--enable-cross-compile \\
--sysroot=$SYSROOT \\
--extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \\
--extra-ldflags="$ADDI_LDFLAGS" \\
$ADDITIONAL_CONFIGURE_FLAG
以上是关于如何在Android设备中用NDK编译SQLite并且对SQLite进行操作的主要内容,如果未能解决你的问题,请参考以下文章
Android NDK 创建可执行文件但未将其推送到设备上 (Eclipse)
Android NDK编译如何强制使用libc++.a的静态链接库
如何确定 C 代码是为 Android/NDK 还是 iOS 编译的
紧急求助,请问如何在android 系统中通过ndk内嵌c版bullet物理引擎???主要是如何编译bullet源代码?...