新建一个jni的文件夹,放入http_client.c mongoose.c mongoose.h Android.mk文件,Android.mk文件内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_CFLAGS += -pie -fPIE
LOCAL_LDFLAGS += -pie -fPIE
LOCAL_MODULE := mongoose
LOCAL_SRC_FILES := http_client.c mongoose.c
include $(BUILD_EXECUTABLE) #可执行文件
- cd到该目录,执行ndk-build,会生成libs和obj两个文件夹,libs/armeabi/下会有可执行文件mongoose,将该文件push到手机的/data/local。
- adb shell进入手机的/data/local目录,执行./mongoose即可。
- 手机端访问127.0.0.1:8080即可访问到该网页
在Android 5.0及以后版本,若没有添加
LOCAL_CFLAGS += -pie -fPIE
LOCAL_LDFLAGS += -pie -fPIE
会出现如下错误:
error: only position independent executables (PIE) are supported.
这是因为,PIE这个安全机制从4.1引入,Android 5.0之前的系统版本并不会去检验可执行文件是否基于PIE编译出的,因此不会报错。但是Android 5.0以后已经开启验证,如果调用的可执行文件不是基于PIE方式编译的,则无法运行。解决办法非常简单,在Android.mk中加入上面两个FLAG即可。
java中调用mongoose的方法
1. Executing mongoose from the Java application using Runtime.getRuntime().exec call
2. Building a shared library and calling its functions using JNI.