前言: 在项目过程中遇到一个需求, 要集成第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库实现,并定义在对外的头文件里。 由此整个工作就大功告成
相关推荐
这个是Android NDK上调用第三方的动态库的实例,而且代码简单容易理解,非常适合新手学习参考,因为网上很多资源是C2C(Copy to Copy)的,有些还不能运行,容易误导新手,并且还要设置积分,我免积分提供给网友下载...
Android ndk下获取系统使用时间
博客名称 : 【Android NDK 开发】在 C 代码中获取 Android 系统信息 ( NDK 项目创建 | NDK 配置 | 获取 Android 系统版本号 ) 博客地址 : https://hanshuliang.blog.csdn.net/article/details/102933704
使用Android NDK编译Android平台的eXosip库,有静态库和动态库。
Android_NDK开发实例, 利用NDK生成SO库,使用SO库进行JNI调用,在Android sdcard创建文件并写入数据。
Android Studio使用第三方so库时编译的源码,AS项目
原文链接 http://blog.csdn.net/u012840567/article/details/53283274
Jni中执行ndk-build,编译第三方静态库(.a)和动态库(.so)的Android.mk文件写法,这是Jni测试引用第三方静态库和动态库demo
安卓NDK调用第三方动态库方法实例, 网上看了很多相关文章,但没有运行一个可用的实例。 参考这个实例,就容易搞了。
Android CMake调用第三方库,自定义StringUtil库,使用NDK-Build编译出各平台so文件。
Android使用NDK打包SO文件,初步NDK开发 .SO文件生成与JIN调用
Android NDK 安装以及 HelloWorld!测试
Android NDK开发动态加载so,采用System.load方法实现
unity-调用动态库so-android篇, so示例制作,ndk-build生成so动态库, unity调用so动态库
使用NDK编译Android第三库.so和.a 文件,参考开源项目
android ndk 开发的简单实例
NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk,并集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件
ndk调用第三方sondk调用第三方sondk调用第三方sondk调用第三方so
android ndk 使用方法android ndk 使用方法
这个虽然只是个简单的jnidemo、但是涵盖了Android.mk 和Application.mk 的原理 重点是Android NDK编译的理解 mac 系统下 切换到jni目录,然后呢个 ndk-build