前言: 在项目过程中遇到一个需求, 要集成第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库实现,并定义在对外的头文件里。 由此整个工作就大功告成
相关推荐
题目中提到的"利用JNI封装个so文件调用第三方的so文件的函数"意味着我们需要在我们的本地代码中,进一步调用已经存在的第三方.so库。首先,确保将第三方库复制到项目的jniLibs目录下。然后,在本地代码中,使用`...
"androidNDK 打so"指的是通过NDK来编译和打包动态链接库(.so文件),这些库可以被Java代码调用,实现Java层与原生层的交互。 1. **NDK介绍**: NDK是Google提供的一个开发工具,它允许开发者在Android平台上使用C...
Android 通过 JNI 调用.so 动态库 Android 通过 JNI(Java Native Interface)调用.so 动态库是 Android 开发中的一种常用技术。JNI 是一种允许 Java 代码与 native 代码之间进行交互的接口。通过 JNI,我们可以在 ...
Android系统会在运行时自动加载对应的.so库。 总结: 通过JNI调用第三方动态库在Android开发中是常见操作,涉及到的知识点包括Java本地方法声明、JNI接口定义、Makefile编写以及NDK编译。在实际操作过程中,务必...
NDK 调用第三方库的方法 1,编写基础库 libndktest.so,实现一个加法(a+b); 2,编写一个基本的android程序在 MainActivity 中调libndktest.so 并实现其中的加法; 3,对原有的外部库进行进一步封装,并实现其中的...
此外,NDK还支持第三方库的预编译,开发者可以直接将预编译好的库集成到项目中,大大简化了开发流程。 在实际应用中,NDK的使用通常分为几个步骤:配置NDK环境,编写C/C++代码,创建Android.mk或CMakeLists.txt构建...
2. Android开发历史上的变化:在NDK出现之前,Android第三方应用程序主要通过Dalvik虚拟机来执行Java代码。NDK的出现为开发者提供了一种新的方式,直接访问Android系统的底层资源和硬件能力,使得性能要求较高的应用...
9. **调试技巧**:学习使用NDK提供的gdb调试器或其他第三方工具进行原生代码的调试,定位和解决问题。 10. **内存管理**:理解原生代码中的内存分配与释放规则,防止内存泄漏和悬挂指针,这是C/C++编程中非常重要的...
### Android 平台怎样使用第三方动态库 #### 一、检查所需文件是否齐全 在开始集成第三方动态库之前,确保具备以下两个基本文件: 1. **动态库**:通常为 `.so` 文件,即共享对象文件,它包含了库的功能实现。 2....
因此,在使用FFmpeg时,最好依赖经过广泛测试和维护的版本,或者考虑使用已封装好的第三方库,如ExoPlayer。 通过以上解释,我们可以看到在Android开发中使用FFmpeg的.so库涉及到了很多技术层面,包括多媒体处理、...
3. **构建项目**:使用NDK工具链构建项目,生成.so动态链接库。 4. **集成到Android应用**:将生成的.so文件添加到项目中,并在Java代码中调用这些原生方法。 #### 七、实战案例分析 文档提到,《Google Android...
3. 配置libcurl的配置脚本`configure`,指定Android的目标架构、NDK路径以及OpenSSL库的位置。 4. 使用`./configure`生成Makefile,然后运行`make`进行编译。 5. 编译完成后,会得到一个动态库(`.so`文件)和可能的...
- **库封装**:将第三方C/C++库集成到Android应用中,例如OpenSSL、FFmpeg等。 - **多平台兼容性**:同一份原生代码可以针对不同设备架构进行编译,简化跨平台开发。 - **游戏开发**:游戏引擎通常使用C/C++编写...
Android本身并不直接支持串口操作,但存在许多第三方库,如USBSerialForAndroid,可以帮助简化串口开发。这些库通常已经封装了JNI层,可以直接在Java中使用API。 7. **异常处理** 由于串口操作可能涉及到硬件问题...
GMSSL 3.0 是一个针对 Android 平台的开源 SSL/TLS 实现项目,它在 GNU BoringSSL 的基础上进行了改进和优化,以...通过这个工程,开发者可以学习到如何在 Android 环境下整合和利用第三方加密库,提升应用的安全性。
在`Android.mk`所在目录执行`ndk-build`命令来生成动态库文件。 ##### 4.5 加载动态库 在Java代码中通过`System.loadLibrary`方法加载动态库: ```java static { System.loadLibrary("hello"); } ``` #### 五、...
在描述中提到的“jni封装第三方so测试”,我们可以推断这个项目的目标是展示如何将一个第三方的SO库导入到Android项目中,并通过JNI进行调用。以下是这个过程可能涉及的一些关键步骤和知识点: 1. **设置环境**:...
- API级别29是Android 10的代号,表示这些预编译的.so库是为Android 10系统优化的,可能不完全兼容更低版本的Android系统。 4. **Android.mk与Application.mk**: - 在NDK编译过程中,通常会用到这两个配置文件。...
对于非专业人士,建议寻找已有的、经过广泛测试的第三方应用,如Tuxera NTFS for Android等,它们已经封装好了ntfs-3g驱动,并提供了用户友好的界面。 总的来说,移植ntfs-3g到Android是一项技术含量较高的工作,...
在Android开发中,为了增强应用的安全性,有时我们需要将敏感数据或关键算法封装在本地库(.so文件)中,防止被轻易逆向工程破解。本文将详细介绍如何使用Android Studio(AS)生成.so文件,并将其引入到其他项目中...