JNI wrapper for x264
来源:互联网 发布:tensorflow 版本区别 编辑:程序博客网 时间:2024/05/17 20:09
LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := x264LOCAL_SRC_FILES := $(LOCAL_PATH)/libx264.soinclude $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS)LOCAL_MODULE := libgl2jni#LOCAL_CFLAGS := -WerrorLOCAL_SRC_FILES := gl_code.cppLOCAL_LDLIBS := -llog -lGLESv2
LOCAL_STATIC_LIBRARIES := libx264include $(BUILD_SHARED_LIBRARY)
以上是Android.mk,放在jni目录下面
注意:
作为第三方库,把libx264.so添加到Android中时,需要使用Android的内置宏:PREBUILT_SHARED_LIBRARY。该宏功能相当于将预编译好的由LOCAL_SRC_FILES指定的库文件,拷贝到指定目录下,(如果是Android源代码环境下编译,就拷贝到/system/lib/目录),对于应用程序,一般是先拷贝到obj/local/armeabi/,再拷贝到libs/armeabi/下面。
对于静态库,则使用PREBUILT_STATIC_LIBRARY。
下面是x264的jni wapper
#include <string.h>#include <jni.h>#include <stdio.h>#include <stdlib.h>#include <arpa/inet.h>//#include <x264.h>extern "C" {#include "x264.h"};#define DATA_MAX 3000000#define H264_MTU 1024typedef struct{ x264_param_t * param; x264_t *handle; x264_picture_t * picture; x264_nal_t *nal;} Encoder;jlong Java_h264_com_H264Encoder_CompressBegin(JNIEnv* env, jobject thiz, jint width, jint height) { Encoder * en = (Encoder *) malloc(sizeof(Encoder)); en->param = (x264_param_t *) malloc(sizeof(x264_param_t)); en->picture = (x264_picture_t *) malloc(sizeof(x264_picture_t)); x264_param_default(en->param); //set default param //en->param->rc.i_rc_method = X264_RC_CQP; en->param->i_log_level = X264_LOG_NONE; en->param->i_width = width; //set frame width en->param->i_height = height; //set frame height en->param->rc.i_lookahead =0; en->param->i_bframe=0; en->param->i_fps_num =5; en->param->i_fps_den = 1; if ((en->handle = x264_encoder_open(en->param)) == 0) { return 0; } /* Create a new pic */ x264_picture_alloc(en->picture, X264_CSP_I420, en->param->i_width, en->param->i_height); return (jlong) en;}jint Java_h264_com_H264Encoder_CompressEnd(JNIEnv* env, jobject thiz,jlong handle){ Encoder * en = (Encoder *) handle; if(en->picture) { x264_picture_clean(en->picture); free(en->picture); en->picture = 0; } if(en->param) { free(en->param); en->param=0; } if(en->handle) { x264_encoder_close(en->handle); } free(en); return 0;}jint Java_h264_com_H264Encoder_CompressBuffer(JNIEnv* env, jobject thiz,jlong handle,jint type,jbyteArray in, jint insize,jbyteArray out){ Encoder * en = (Encoder *) handle; x264_picture_t pic_out; int i_data=0; int nNal=-1; int result=0; int i=0,j=0; int nPix=0; jboolean isCopy = false; jbyte * Buf = (jbyte*)(*env).GetByteArrayElements(in, &isCopy); jbyte * h264Buf = (jbyte*)(*env).GetByteArrayElements(out, &isCopy); unsigned char * pTmpOut = (unsigned char *)h264Buf; int nPicSize=en->param->i_width*en->param->i_height; /* Y鏁版嵁鍏ㄩ儴浠庡湪涓€鍧楋紝UV鏁版嵁浣跨敤interleave鏂瑰紡瀛樺偍 YYYY YYYY UVUV */ jbyte * y=(jbyte *)en->picture->img.plane[0]; jbyte * v=(jbyte *)en->picture->img.plane[1]; jbyte * u=(jbyte *)en->picture->img.plane[2]; memcpy(en->picture->img.plane[0],Buf,nPicSize); for (i=0;i<nPicSize/4;i++) { *(u+i)=*(Buf+nPicSize+i*2); *(v+i)=*(Buf+nPicSize+i*2+1); } switch (type) { case 0: en->picture->i_type = X264_TYPE_P; break; case 1: en->picture->i_type = X264_TYPE_IDR; break; case 2: en->picture->i_type = X264_TYPE_I; break; default: en->picture->i_type = X264_TYPE_AUTO; break; } if( x264_encoder_encode( en->handle, &(en->nal), &nNal, en->picture ,&pic_out) < 0 ) { return -1; } for (i = 0; i < nNal; i++){ memcpy(pTmpOut, en->nal[i].p_payload, en->nal[i].i_payload); pTmpOut += en->nal[i].i_payload; result+=en->nal[i].i_payload; } return result;}
- JNI wrapper for x264
- Appium Wrapper for Java
- Appium Wrapper for Java
- Python Wrapper for FaceRecognizer
- Android jni包裹文件(jni wrapper)
- CppSQLite - C++ Wrapper for SQLite
- My C++ Wrapper for FreeTDS
- CppSQLite - C++ Wrapper for SQLite
- CppSQLite - C++ Wrapper for SQLite
- cdev wrapper for block rw
- 编译x264 for ios
- Wrapper
- wrapper
- x264软编码(jni接口)
- C++ Wrapper for Standard UNIX Functions
- A wrapper class for the DirectSound API
- Python wrapper module for the Spread
- wx.NET CLI wrapper for wxWidgets
- java程序员面试必备的32个考点
- 如何计算某一天是星期几?
- 3 synchronized和Lcok+Condition对比续
- c# - 字符串是否是Int?
- 触发器的简单使用
- JNI wrapper for x264
- C# App.config 数据库操作
- java设计模式 单例设计模式+静态工厂模式
- listview滑动删除
- 求两个数的和差积商
- Linux环境中普通用户切换到root用户问题
- 利用nutch-1.2和Lucene 搭建自己的搜索平台, Apache Mahout 构建社会化推荐引擎
- vc++实现控制USB设备启用与否
- 网页特定数据采集