Android NDK封装非系统第3方so库
2015-08-25 12:27
381 查看
前言: 在项目过程中遇到一个需求, 要集成第3方公司提供的滤镜功能, 第3方提供了对外接口的.h头文件和实现so库, 项目需要整合第3方so库到自己的so库中
1: 新建android工程, 建立jni目录, 在jni目录新建ImageAlogrithm目录, 放入第3方公司提供的.h头文件,
在jni目录下放入第3方提供的实现so库文件libImageAlorgrithm.so
2 编写对应的Android.mk文件:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := ImageAlogrithm LOCAL_SRC_FILES := libImageAlogrithm.so LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/ImageAlogrithm include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := neosharePragueFilters LOCAL_SRC_FILES := neosharePragueFilters.c LOCAL_SDK_VERSION := 9 LOCAL_SHARED_LIBRARIES := libImageAlogrithm LOCAL_LDLIBS := -llog -ljnigraphics include $(BUILD_SHARED_LIBRARY)
3 编写实现的c文件,native方法和C/C++ 函数有两种对应方式,一种是静态注册,即 Java_包名_类名_方法名对应,另一种通过重写JNI_OnLoad函数实现动态注册。我们使用第2种方式。
#include <string.h> #include <jni.h> #include <NubiaEffectInterface.h> #include <android/bitmap.h> #define JNIREG_CLASS "cn/nubia/prague/PragueFilterNative" void applyFilter(JNIEnv* env, jobject thiz, jobject bitmap, jint width, jint height, jint index) { char* destination = 0; AndroidBitmap_lockPixels(env, bitmap, (void**) &destination); int tot_len = height * width * 4; int i; unsigned char * dst = destination; unsigned char * pTemp = malloc(tot_len * sizeof(unsigned char)); NubiaFunctionRGBA8888ToBGRA8888(pTemp, dst, width, height); char * effect; switch (index) { case 1: effect = "LOMO_effect"; break; case 2: effect = "gray-scale"; break; case 3: effect = "miniature"; break; case 4: effect = "sketch"; break; case 5: effect = "pragueThree"; break; case 6: effect = "emboss_effect"; break; default: break; } NubiaFunctionSpecialEffectBGRA8888InAndRGBA8888Out(effect, pTemp, dst, width, height); free(pTemp); AndroidBitmap_unlockPixels(env, bitmap); } /** * Table of methods associated with a single class. */ static JNINativeMethod gMethods[] = { { "nativeApplyFilter", "(Landroid/graphics/Bitmap;III)V", (void *)applyFilter}, //绑定 }; /* * Register several native methods for one class. */ static int registerNativeMethods(JNIEnv* env, const char* className, JNINativeMethod* gMethods, int numMethods) { jclass clazz; clazz = (*env)->FindClass(env, className); if (clazz == NULL) { return JNI_FALSE; } if ((*env)->RegisterNatives(env, clazz, gMethods, numMethods) < 0) { return JNI_FALSE; } return JNI_TRUE; } /** * Register native methods for all classes we know about. */ static int registerNatives(JNIEnv* env) { if (!registerNativeMethods(env, JNIREG_CLASS, gMethods, sizeof(gMethods) / sizeof(gMethods[0]))) return JNI_FALSE; return JNI_TRUE; } JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) { JNIEnv* env = NULL; jint result = -1; if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK) { return result; } if (!registerNatives(env)) { //register return result; } result = JNI_VERSION_1_4; return result; }
其中applyFilter函数中调用的NubiaFunctionRGBA8888ToBGRA8888和 NubiaFunctionSpecialEffectBGRA8888InAndRGBA8888Out函数的由第3方提供so库实现,并定义在对外的头文件里。 由此整个工作就大功告成
相关文章推荐
- JSP网站系统数据库Mysql封装及连接主要代码
- 升讯威微信营销系统开发实践:(5) Github 源码:微信接口的 .NET 封装
- 最新万能Ghost系统封装超详细图文教程、工具原理
- 关于系统封装讲解
- 数组练习:各种数组方法的使用&&事件练习:封装兼容性添加、删除事件的函数&&星级评分系统
- PDA电子邮件系统中邮件识别与封装模块的设计与实现
- 将C/C++封装成python的API 利用Swig 在Linux系统上
- linux系统搭建本地yum源以及搭建第3方软件仓库
- ToastUtils 对系统Toast的封装
- UIKit封装的系统动画
- 系统按键:Home键和最近任务键的监听器简单封装
- 自定义控件(16)---代码方式组合系统控件,并封装自定义控件思想
- 深入理解Lustre文件系统-第11篇 Lustre一般化文件系统封装层:fsfilt
- Android NDK项目中使用SWIG生成JAVA类和C/C++封装代码
- linux下系统的封装
- 打包Android系统ANE扩展时,包含资源文件和.so库
- 将当前的Ubuntu系统封装成为可以安装(发布)的iso镜像
- windows系统上安装与使用Android NDK
- ThinkPHP3.2.3 验证码 上传图片 制作缩略图 2.为自己的项目封装功能类 利用Page工具类实现分页效果 后台管理员登录系统实现
- 【转】 XP SP3系统安装光盘,支持开启AHCI直接安装,可做封装母盘