需求
- android中要使用串口,谷歌官方在github上有提供代码实例,里面有JNI的代码和串口API的java文件,工程的地址如下:
https://github.com/cepr/android-serialport-api - 要用到64位的so,但是官方下载的libserial_port.so中没有64位的,需要自己编译,但是用android studio加载它的工程会发现编译不过,会提示一大堆“Error:(27, 20) java: 程序包android.util不存在”等错误。
命令行下手动编译64位库
- 确定ndk所在目录,比如/opt/android/android-sdk-linux/ndk/21.3.6528147/ndk-build/
- 从android-serialport-api/project/jni/中拷贝出SerialPort.c SerialPort.h
- 生成Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_LDLIBS := -lm -llog
LOCAL_MODULE := serial_port
LOCAL_SRC_FILES := SerialPort.c
include $(BUILD_SHARED_LIBRARY)
- 生成Application.mk
APP_MODULES = serial_port
//APP_ABI := armeabi-v7a arm64-v8a
APP_STL := stlport_static
ifeq ($(NDK_DEBUG), 1)
APP_OPTIM = debug
APP_CFLAGS = -g -O0
else
APP_OPTIM = release
APP_CFLAGS = -O3
endif
APP_CPPFLAGS := -frtti -DCC_ENABLE_CHIPMUNK_INTEGRATION=1 -std=c++0x
APP_CPPFLAGS += -fexceptions
- 编译
进入放SerialPort.c的目录
/opt/android/android-sdk-linux/ndk/21.3.6528147/ndk-build NDK_PROJECT_PATH=./ APP_BUILD_SCRIPT=./Android.mk
生成
ls libs/
arm64-v8a armeabi-v7a x86 x86_64
ls libs/arm64-v8a/
libserial_port.so
编译过程遇到问题及解决方式
问题:
undefined reference to __android_log_print’
解决:
Android.mk中添加
LOCAL_LDLIBS := -lm -llog
问题:
Android NDK: Could not find application project directory !
Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.
/opt/android/android-sdk-linux/ndk/21.3.6528147/build/core/build-local.mk:151: *** Android NDK: Aborting . Stop.
原因是不能单独用ndk-build,要带一些参数,设定当前工程目录。
解决:
添加NDK_PROJECT_PATH参数,这里我们因为是在源码目录下,直接设定为当前目录 ./
ndk-build NDK_PROJECT_PATH=./
问题:
Android NDK: APP_PLATFORM not set. Defaulting to minimum supported version android-16.
Android NDK: Your APP_BUILD_SCRIPT points to an unknown file: .//jni/Android.mk
/opt/android/android-sdk-linux/ndk/21.3.6528147/build/core/add-application.mk:88: *** Android NDK: Aborting… . Stop.
原因是要指定APP_BUILD_SCRIPT,设定Android.mk的位置
解决:
ndk-build命令中加参数APP_BUILD_SCRIPT=./Android.mk
ndk-build NDK_PROJECT_PATH=./ APP_BUILD_SCRIPT=./Android.mk
作者:帅得不敢出门