好久没有在Eclipse上通过NDK根据编译使用so,今天写了一个简单的demo就各种报错,下面做个笔记记录在Eclipse使用so的步骤:
1.创建工程,添加支持
创建工程,添加native支持:add native support,指定对应的so名称!
2.编写native关键字代码
编写调用native代码,同时加上:
static {
System.loadLibrary("soname");
}
3.编译一下工程,命令生成头文件
编译工程,产生对应的class,在src目录下通过 javah com.example.Test.aaa生成头文件!
然后刷新工程,将src下面生成的头文件移到jni目录
4.编写Android.mk
在第一个步骤之后,就会生成Android.mk,现在需要编写编译规则,比如:
LOCAL_PATH := $(call my-dir)
// 指定依赖的动态so库
include $(CLEAR_VARS)
LOCAL_MODULE := aaa // 模块的名称
LOCAL_SRC_FILES := libaaaa.so // 依赖的so名称
include $(PREBUILT_SHARED_LIBRARY) // 作为共享库预编译
// 指定依赖的静态.a库
include $(CLEAR_VARS)
LOCAL_MODULE := bbb
LOCAL_SRC_FILES := bbb/libbbb.a //指定so的路径
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/bbb/include //指定该.a依赖的c文件
include $(BUILD_STATIC_LIBRARY) // 作为静态库进行编译
include $(CLEAR_VARS)
LOCAL_MODULE := test
LOCAL_SRC_FILES := test.c
//指定依赖的.c文件 (这里依赖的.c文件可以写到对应模块需要的.c文件的地方,如什么的静态库一样)
LOCAL_C_INCLUDES += $(LOCAL_PATH)/aaa/include
LOCAL_C_INCLUDES += $(LOCAL_PATH)/ccc/include
// 指定依赖的静态库
LOCAL_STATIC_LIBRARIES := bbb
// 指定依赖的动态库
LOCAL_SHARED_LIBRARIES := aaa ccc
include $(BUILD_SHARED_LIBRARY)
5.实现头文件定义的函数
在test.c里面include该头文件,然后实现定义的方法!
6.万事大吉只欠运行
运行工程!
注意事项:
1.在建工程的时候,包名千万不要写成如下形式:
com.example.test_jni(包含下划线)
如果有下划线,那么在生成的头文件就会如下:
Java_com_example_test_jni_Test_method
这样运行的时候,就会去com/example/test/jni/目录下面去找Test,但是工程没有这个目录,导致找不到对应的jni实现而崩溃,切记!
2.不要忘记:
static {
System.loadLibrary("live");
}
3.仔细检查Android.mk文件
一般出错在上面的几个地方!