1、Android代码
.java -javac-> .class -javah-> .h ,现没有.h文件,是直接starcor-needle-lib.cpp这个文件
2、中间件代码实现JNI接口
JNIEXPORT jstring JNICALL Java_com_starcor_data_needle_crawler_crawl_NeedleJNI_getSysInfo(JNIEnv *env, jobject instance, jstring cmd)
3、编译环境
安装ndk:
android-ndk-r12b-linux-x86_64.zip 解压在/usr/local/arm下面,路径加入到PATH中:
vi /root/.bashrc
在文件最后加入下面字符:
export PATH=/usr/local/arm/android-ndk-r12b:$PATH
最后 source ~/.bashrc
4、编写Android.mk
BigDataNeedleCrawler_V1.x/needle_jni/
jni/Android.mk
include $(call all-subdir-makefiles)
jni/src/Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := starcor-needle-lib #表示模块名称
LOCAL_SRC_FILES := http/http-hdr.cpp \ #表示需要参与编译的源文件
needle/misc.cpp \
needle/needlecommon.cpp \
needle/needlefilter.cpp \
needle/needleimpl.cpp \
needle/needlepackage.cpp \
needle/needle_pcre.cpp \
report/reportcenter.cpp \
report/reportpackage.cpp \
msgque/NeedleMsg.cpp \
needle/starcor-needle-lib.cpp
LOCAL_CXXFLAGS += --std=c++11 -O2 #CXXFLAGS 表示用于 C++ 编译器的选项
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../include
LOCAL_LDFLAGS += -lminidpi #链接库needle_jni/libs/libminidpi.a
LOCAL_LDFLAGS += -lpcre #链接库libpcre.a
LOCAL_LDFLAGS += -lyysdk #链接库libyysdk.a
LOCAL_LDFLAGS += -Llibs #LDFLAGS是告诉链接器从哪里寻找库文件
LOCAL_LDLIBS += -llog # LIBS是告诉链接器要链接哪些库文件
LOCAL_LDLIBS += -pthread
LOCAL_LDLIBS += -lstdc++
include $(BUILD_SHARED_LIBRARY)
5、编写Application.mk
jni/Application.mk
APP_PLATFORM:=android-19
APP_ABI := armeabi #用作配置要编译的CPU架构平台的类型
APP_STL := gnustl_static
6、编译starcor_needle_lib_test规则文件CMakeLists.txt
jni/CMakeLists.txt
PROJECT(starcor-needle-lib)
SET(AFANDA_CROSS_PRE "arm-linux-androideabi-")
INCLUDE_DIRECTORIES(${CMAKE_HOME_DIRECTORY}/include)
LINK_DIRECTORIES(${CMAKE_HOME_DIRECTORY}/src)
TARGET ${PROJECT_NAME}
POST_BUILD
COMMAND ${CMAKE_STRIP} ${PROJECT_BINARY_DIR}/lib${PROJECT_NAME}.so
COMMAND cp -f ${PROJECT_BINARY_DIR}/lib${PROJECT_NAME}.so ${ELF_FILE_PATH}/lib${PROJECT_NAME}.so
编译:needle_jni/jni/build#
Cmake ..
Make
生成:libstarcor-needle-lib.so starcor_needle_lib_test(运行时需要链接动态库吗?不需要.so库,需要.a库;可以与.so库的代码同时运行吗?可以的)
7、编译ndk-build
root@ubuntu:/home/yubo.wang/BigDataNeedleCrawler_V1.x/needle_jni# ndk-build
Android NDK: WARNING:jni/src/Android.mk:starcor-needle-lib: non-system libraries in linker flags: -lminidpi -lpcre -lyysdk
Android NDK: This is likely to result in incorrect builds. Try using LOCAL_STATIC_LIBRARIES
Android NDK: or LOCAL_SHARED_LIBRARIES instead to list the library dependencies of the
Android NDK: current module
[armeabi] Install : libstarcor-needle-lib.so => libs/armeabi/libstarcor-needle-lib.so
生成动态库:libs/armeabi/libstarcor-needle-lib.so
8、提供动态库给apk,具体放哪里?怎么操作的?待续。。。