`
zgcypjhf
  • 浏览: 5419 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Android NDK封装非系统第3方so库

阅读更多


前言:  在项目过程中遇到一个需求, 要集成第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库实现,并定义在对外的头文件里。 由此整个工作就大功告成酷




   



 

分享到:
评论

相关推荐

    调用第三方so库文件

    题目中提到的"利用JNI封装个so文件调用第三方的so文件的函数"意味着我们需要在我们的本地代码中,进一步调用已经存在的第三方.so库。首先,确保将第三方库复制到项目的jniLibs目录下。然后,在本地代码中,使用`...

    androidNDK 打so

    "androidNDK 打so"指的是通过NDK来编译和打包动态链接库(.so文件),这些库可以被Java代码调用,实现Java层与原生层的交互。 1. **NDK介绍**: NDK是Google提供的一个开发工具,它允许开发者在Android平台上使用C...

    Android通过JNI调用.so动态库

    Android 通过 JNI 调用.so 动态库 Android 通过 JNI(Java Native Interface)调用.so 动态库是 Android 开发中的一种常用技术。JNI 是一种允许 Java 代码与 native 代码之间进行交互的接口。通过 JNI,我们可以在 ...

    通过JNI调用第三方动态库(生成两个.so文件)

    Android系统会在运行时自动加载对应的.so库。 总结: 通过JNI调用第三方动态库在Android开发中是常见操作,涉及到的知识点包括Java本地方法声明、JNI接口定义、Makefile编写以及NDK编译。在实际操作过程中,务必...

    ndk调用第三方库实例测试

    NDK 调用第三方库的方法 1,编写基础库 libndktest.so,实现一个加法(a+b); 2,编写一个基本的android程序在 MainActivity 中调libndktest.so 并实现其中的加法; 3,对原有的外部库进行进一步封装,并实现其中的...

    android-ndk-r20-linux-x86_64.zip

    此外,NDK还支持第三方库的预编译,开发者可以直接将预编译好的库集成到项目中,大大简化了开发流程。 在实际应用中,NDK的使用通常分为几个步骤:配置NDK环境,编写C/C++代码,创建Android.mk或CMakeLists.txt构建...

    android NDK 开发总结

    2. Android开发历史上的变化:在NDK出现之前,Android第三方应用程序主要通过Dalvik虚拟机来执行Java代码。NDK的出现为开发者提供了一种新的方式,直接访问Android系统的底层资源和硬件能力,使得性能要求较高的应用...

    Android NDK Beginner’s Guide第六章源码

    9. **调试技巧**:学习使用NDK提供的gdb调试器或其他第三方工具进行原生代码的调试,定位和解决问题。 10. **内存管理**:理解原生代码中的内存分配与释放规则,防止内存泄漏和悬挂指针,这是C/C++编程中非常重要的...

    Android_平台怎样使用第三方动态库

    ### Android 平台怎样使用第三方动态库 #### 一、检查所需文件是否齐全 在开始集成第三方动态库之前,确保具备以下两个基本文件: 1. **动态库**:通常为 `.so` 文件,即共享对象文件,它包含了库的功能实现。 2....

    Android FFMPEG 的so库

    因此,在使用FFmpeg时,最好依赖经过广泛测试和维护的版本,或者考虑使用已封装好的第三方库,如ExoPlayer。 通过以上解释,我们可以看到在Android开发中使用FFmpeg的.so库涉及到了很多技术层面,包括多媒体处理、...

    android NDK

    3. **构建项目**:使用NDK工具链构建项目,生成.so动态链接库。 4. **集成到Android应用**:将生成的.so文件添加到项目中,并在Java代码中调用这些原生方法。 #### 七、实战案例分析 文档提到,《Google Android...

    android平台libcurl-7.35.0编译成果物(支持openssl)

    3. 配置libcurl的配置脚本`configure`,指定Android的目标架构、NDK路径以及OpenSSL库的位置。 4. 使用`./configure`生成Makefile,然后运行`make`进行编译。 5. 编译完成后,会得到一个动态库(`.so`文件)和可能的...

    android-ndk-r15c-windows-x86-64.zip

    - **库封装**:将第三方C/C++库集成到Android应用中,例如OpenSSL、FFmpeg等。 - **多平台兼容性**:同一份原生代码可以针对不同设备架构进行编译,简化跨平台开发。 - **游戏开发**:游戏引擎通常使用C/C++编写...

    SerialPort Android串口开发

    Android本身并不直接支持串口操作,但存在许多第三方库,如USBSerialForAndroid,可以帮助简化串口开发。这些库通常已经封装了JNI层,可以直接在Java中使用API。 7. **异常处理** 由于串口操作可能涉及到硬件问题...

    gmssl 3.0 - android 编译工程

    GMSSL 3.0 是一个针对 Android 平台的开源 SSL/TLS 实现项目,它在 GNU BoringSSL 的基础上进行了改进和优化,以...通过这个工程,开发者可以学习到如何在 Android 环境下整合和利用第三方加密库,提升应用的安全性。

    NDK从入门到精通CSDN

    在`Android.mk`所在目录执行`ndk-build`命令来生成动态库文件。 ##### 4.5 加载动态库 在Java代码中通过`System.loadLibrary`方法加载动态库: ```java static { System.loadLibrary("hello"); } ``` #### 五、...

    myhello4.zip

    在描述中提到的“jni封装第三方so测试”,我们可以推断这个项目的目标是展示如何将一个第三方的SO库导入到Android项目中,并通过JNI进行调用。以下是这个过程可能涉及的一些关键步骤和知识点: 1. **设置环境**:...

    FFMPEG_ANDROID.zip

    - API级别29是Android 10的代号,表示这些预编译的.so库是为Android 10系统优化的,可能不完全兼容更低版本的Android系统。 4. **Android.mk与Application.mk**: - 在NDK编译过程中,通常会用到这两个配置文件。...

    移植到 android 下的 ntfs-3g

    对于非专业人士,建议寻找已有的、经过广泛测试的第三方应用,如Tuxera NTFS for Android等,它们已经封装好了ntfs-3g驱动,并提供了用户友好的界面。 总的来说,移植ntfs-3g到Android是一项技术含量较高的工作,...

    as生成.so文件,并引用到其它项目中进行调用

    在Android开发中,为了增强应用的安全性,有时我们需要将敏感数据或关键算法封装在本地库(.so文件)中,防止被轻易逆向工程破解。本文将详细介绍如何使用Android Studio(AS)生成.so文件,并将其引入到其他项目中...

Global site tag (gtag.js) - Google Analytics