将NDK和Gstreamer使用的Eclipse Android项目迁移到Android Studio [英] Migrating Eclipse android project with NDK and Gstreamer usage to Android Studio

查看:1340
本文介绍了将NDK和Gstreamer使用的Eclipse Android项目迁移到Android Studio的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Eclipse中有一个完美工作的android项目,该项目包括NDK支持,并使用Gstreamer。
当我将项目从Eclipse迁移到Android Studio时会弹出各种问题,我只是无法成功编译项目。



我做了一个彻底的研究我遇到的每一个错误,但仍然无法在android studio上编译和运行该项目。



https://drive.google.com/file/d/0B_euzgSjTAqcQngwbzR1cXY0MkU/view?usp=sharing



一个链接到工作的Eclipse项目,我希望有人可以指导我正确的方式。



这是导入摘要:



ECLIPSE ANDROID PROJECT IMPORT SUMMARY



忽略的文件:



将以下文件复制到新的Gradle项目中;
应该评估这些项目是否仍然需要您的项目,如果
手动移动它们:




  • .externalToolBuilders \

  • .externalToolBuilders\Wiz.launch

  • gst-build\

  • gst-build \gstreamer_android.c

  • gst-build\gstreamer_android.o



依赖关系:



导入程序将以下.jar文件识别为第三方
库,并替换为Gradle依赖项。这有
的优势是更明确的版本信息是已知的,并且
库可以自动更新。但是,有可能
项目中的.jar文件的版本比我们选择的
依赖项更旧,这可能会导致项目无法编译。
您可以在导入向导中禁用该jar替换,然后再次尝试:



android-support-v4.jar => com.android.support:support- v4:23.3.0



移动文件:



Android Gradle项目使用与ADT $ b不同的目录结构$ b Eclipse项目。以下是项目重组的方式:




  • AndroidManifest.xml => app \src\main\AndroidManifest.xml

  • assets\ => app \src\main\assets\

  • jni\ => app \src\main\jni \

  • libs\armeabi\libavcodec.so => app \src\main\jniLibs\armeabi\libavcodec.so

  • $ li $ lib $ $。$ main\jniLibs\armeabi\libavformat.so
  • libs\armeabi\libavutil.so => app \src\main\jniLibs\armeabi\libavutil .so

  • libs\armeabi\libgstreamer_android.so => app \src\main\jniLibs\ armeabi\libgstreamer_android.so

  • libs\armeabi\libjniARToolKitPlus.so => app \src\main\jniLibs\marmeabi\libjniARToolKitPlus.so

  • libs\armeabi\libjniavcodec.so => app \src\main\jniLibs\armeabi\libjniavcodec.so

  • libs\ armeabi\libjniavdevice.so => app \src\main\jniLibs\armeabi\libjniavdevice.so

  • libs\armeabi\libjniavfilter.so => app \\ /s> armeabi\libjniavformat.so

  • libs\armeabi\libjniavutil.so => app \src\main\jniLibs\armeabi\libjniavutil.so

  • libs\armeabi\libjnicvkernels.so => app \src\main\jniLibs\armeabi\libjnicvkernels.so

  • libs\ armeabi\libjniopen cv_calib3d.so => app \src\main\jniLibs\marmeabi\libjniopencv_calib3d.so

  • libs\armeabi\libjniopencv_contrib.so => app \src\\ \\main\jniLibs\armeabi\libjniopencv_contrib.so

  • libs\armeabi\libjniopencv_core.so => app \src\main\jniLibs\armeabi\ libjniopencv_core.so

  • libs\armeabi\libjniopencv_features2d.so => app \src\main\jniLibs\marmeabi\libjniopencv_features2d.so

  • libs\armeabi\libjniopencv_flann.so => app \src\main\jniLibs\armeabi\libjniopencv_flann.so

  • libs\armeabi\ libjniopencv_highgui.so => app \src\main\jniLibs\armeabi\libjniopencv_highgui.so

  • libs\armeabi\libjniopencv_imgproc.so => app \src\\ \\ main\jniLibs\armeabi\libjniopencv_imgproc.so

  • libs\armeabi\libjniopencv_legacy。 so => app\src\main\jniLibs\armeabi\libjniopencv_legacy.so

  • libs\armeabi\libjniopencv_ml.so => app \src\main \jniLibs\armeabi\libjniopencv_ml.so

  • libs\armeabi\libjniopencv_nonfree.so => app \src\main\jniLibs\armeabi\libjniopencv_nonfree。所以

  • libs\armeabi\libjniopencv_objdetect.so => app \src\main\jniLibs\armeabi\libjniopencv_objdetect.so

  • libs\armeabi\libjniopencv_photo.so => app \src\main\jniLibs\marmeabi\libjniopencv_photo.so

  • libs\armeabi\libjniopencv_stitching。 so => app \src\main\jniLibs\armeabi\libjniopencv_stitching.so

  • libs\armeabi\libjniopencv_video.so => app \src\main \jniLibs\armeabi\libjniopencv_video.so

  • libs \armeabi\libjniopencv_videostab.so => app \ src\main\jniLibs\armeabi\libjniopencv_videostab.so

  • libs\armeabi\libjnipostproc.so => app \src\main\jniLibs\armeabi \libjnipostproc.so

  • libs\armeabi\libjniswresample.so => app \src\main\jniLibs\marmeabi\libjniswresample.so

  • libs\armeabi\libjniswscale.so => app \src\main\jniLibs\armeabi\libjniswscale.so

  • libs\armeabi \libopencv_calib3d.so => app \src\main\jniLibs\armeabi\libopencv_calib3d.so

  • libs\armeabi\libopencv_contrib.so => app \ src\main\jniLibs\armeabi\libopencv_contrib.so

  • libs\armeabi\libopencv_core.so => app \src\main\jniLibs\armeabi \libopencv_core.so

  • libs\armeabi\libopencv_features2d.so => app \src\main\jniLibs\armeabi\libopencv_feature s2d.so

  • libs\armeabi\libopencv_flann.so => app \src\main\jniLibs\armeabi\libopencv_flann.so

  • libs\armeabi\libopencv_highgui.so => app \src\main\jniLibs\armeabi\libopencv_highgui.so

  • libs\armeabi\ libopencv_imgproc.so => app \src\main\jniLibs\armeabi\libopencv_imgproc.so

  • libs\armeabi\libopencv_info.so => app \src\\ /m> libopencv_legacy.so

  • libs\armeabi\libopencv_ml.so => app \src\main\jniLibs\armeabi\libopencv_ml.so

  • libs\armeabi\libopencv_nonfree.so => app \src\main\jniLibs\armeabi\libopencv_nonfree.so

  • libs\armeabi\ libopencv_objdetect.so => app \src\main\jniLibs\armeabi\libopencv_objdetect.so

  • libs\armeabi\libopencv_photo.so => app \src\main\jniLibs \armeabi\libopencv_photo.so

  • libs\armeabi\libopencv_stitching.so => app \src\main\jniLibs\armeabi\libopencv_stitching.so

  • libs\armeabi\libopencv_ts.so => app \src\main\jniLibs\armeabi\libopencv_ts.so

  • libs \armeabi\libopencv_video.so => app \src\main\jniLibs\armeabi\libopencv_video.so

  • libs\armeabi\libopencv_videostab.so => app \src\main\jniLibs\armeabi\libopencv_videostab.so

  • libs\armeabi\libpostproc.so => app \src\main\jniLibs \armeabi\libpostproc.so

  • libs\armeabi\libswresample.so => app \src\main\jniLibs\armeabi\libswresample.so

  • libs\armeabi\libswscale.so => app \src\main\jniLibs\armeabi\libswscale.so

  • libs \armeabi\libtbb.so => app \src\main\jniLibs\armeabi\libtbb.so

  • libs\javacpp.jar => app \ / lib> app \src\main\res\

  • src\ => app \src\main\java\



下一步:



您现在可以构建项目。 Gradle项目需要网络
连接来下载相关性。



错误:



如果由于某种原因您的项目不会构建,您确定
是由于Eclipse对Gradle进口商的错误或限制,
请在 http://b.android.com ,类别为
组件工具。



(此导入摘要仅供您参考,并且可以在导入满足结果之后删除
。)



Build.Gradle:

 应用插件:'com.android.model.application'

模型{
android {
compileSdkVersion = 23
buildToolsVersion =23.0.2

defaultConfig.with {
applicationId =com.gst_sdk_tutorials.tutorial_4
minSdkVersion.apiLevel = 17
targetSdkVersion.apiLevel = 22
}

}

android.ndk {
moduleName =tutorial-4
cppFlags.addAll([ - I $ {file(src / main / jni / Common / native_app_glue )}toString(),
-I $ {file(src / main / jni / Common / cpufeatures)}toString(),
-I $ {file src / main / jni / Common / ndk_helper)}。toString()])
ldLibs.addAll([android,EGL,GLESv2,dl,log原子])
stl =c ++ _ static
}
// jni是默认的目录;如果你的目录是不同的目录,你可以配置这个
android.sources {
main {
jni {
source {
srcDirs'src / main / jni'
}
}
}
}
android.buildTypes {
release {
minifyEnabled = false
proguardFiles.add(file('proguard- rules.txt'))
}
}
//在armeabi-v7a中打开硬浮动支持
android.abis {
create(armeabi-v7a ){
cppFlags.addAll([ - mhard-float,-D_NDK_MATH_NO_SOFTFP = 1,-mfloat-abi = hard])
ldLibs.add(m_hard)
ldFlags.add( - Wl, - no-warn-mismatch)
}
}
android.productFlavors {
create(arm7){
ndk.abiFilters.add(armeabi-v7a)
}
create(arm8){
ndk.abiFilters.add(arm64-v8a)

create(x86-32){
ndk.abiFilters.add(x86)
}
//详细的abiFilter描述,请参考支持的ABI @
// https://developer.android.com/ndk/guides/abis.html#sa
//构建一个包括所有productFlavors
create(fat)

}

依赖关系{
编译'com.android.support:support-v4:23.3.0'
编译文件('libs / javacpp.jar ')
编译文件('libs / javacv.jar')
}

local.properties:

  ndk.dir = C\:\\Users\\\\wiz\\ \\ Downloads\\android-ndk-r9d 
sdk.dir = D\:\\sdk

.c文件:(由于字符限制而不完整)

  #include< string.h> ; 
#include< jni.h>
#include< android / log.h>
#include< android / native_window.h>
#include< android / native_window_jni.h>
#include< gst / gst.h>
#include< gst / interfaces / xoverlay.h>
#include< gst / video / video.h>
#include< pthread.h>

GST_DEBUG_CATEGORY_STATIC(debug_category);
#define GST_CAT_DEFAULT debug_category

/ *
*这些宏提供了一种方法,将本地指针存储到
*中的CustomData(可能是32位或64位)一个jlong​​,总是64位,没有警告。
* /
#if GLIB_SIZEOF_VOID_P == 8
#define GET_CUSTOM_DATA(env,thiz,fieldID)(CustomData *)(* env) - > GetLongField(env,thiz,fieldID)
#define SET_CUSTOM_DATA(env,thiz,fieldID,data)(* env) - > SetLongField(env,thiz,fieldID,(jlong​​)data)
#else
#define GET_CUSTOM_DATA(env ,(),(),(),(),(*)) SetLongField(env,thiz,fieldID,(jlong​​)(jint)data)
#endif

/ *不要让这个距离更接近。它在视觉上没有用,并且可能会
*混淆一些分离器。 * /
#define SEEK_MIN_DELAY(500 * GST_MSECOND)

/ *结构包含所有我们的信息,所以我们可以将其传递给回调* /
typedef struct _CustomData {
jobject app; / *应用实例,用来调用它的方法。保留全局参考。 * /
GstElement * pipeline; / *运行管道* /
GMainContext *上下文; / *用于运行主循环的GLib上下文* /
GMainLoop * main_loop; / * GLib main loop * /
gboolean initialized; / *为了避免多次通知UI初始化* /
ANativeWindow * native_window; / *将会呈现视频的Android本机窗口* /
GstState状态; / *当前管道状态* /
GstState target_state; / *所需的管道状态,一旦缓冲完成设置* /
gint64持续时间; / *缓存剪辑持续时间* /
gint64 desired_position; / *位置寻求,一旦管道运行* /
GstClockTime last_seek_time; / *寻求溢出预防(节流)* /
gboolean is_live; / *直播流不使用缓冲* /
} CustomData;

/ * playbin2标志* /
typedef枚举{
GST_PLAY_FLAG_TEXT =(1 <<2)/ *我们想要字幕输出* /
} GstPlayFlags;

/ *这些全局变量在执行期间不改变的缓存值* /
static pthread_t gst_app_thread;
static pthread_key_t current_jni_env;
static JavaVM * java_vm;
static jfieldID custom_data_field_id;
static jmethodID set_message_method_id;
static jmethodID set_current_position_method_id;
static jmethodID on_gstreamer_initialized_method_id;
static jmethodID on_media_size_changed_method_id;

/ *
*私有方法
* /

/ *使用VM注册此线程* /
static JNIEnv * attach_current_thread void){
JNIEnv * env;
JavaVMAttachArgs args;

GST_DEBUG(附加线程%p,g_thread_self());
args.version = JNI_VERSION_1_4;
args.name = NULL;
args.group = NULL;

if((* java_vm) - > AttachCurrentThread(java_vm,& env,& args)< 0){
GST_ERROR(无法附加当前线程);
返回NULL;
}

return env;
}

/ *从VM中注销此线程* /
static void detach_current_thread(void * env){
GST_DEBUG(分离线程%p,g_thread_self ());
(* java_vm) - > DetachCurrentThread(java_vm);
}

/ *检索此线程的JNI环境* /
static JNIEnv * get_jni_env(void){
JNIEnv * env;

if((env = pthread_getspecific(current_jni_env))== NULL){
env = attach_current_thread();
pthread_setspecific(current_jni_env,env);
}

return env;
}

android.mk导入之前:

  LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE:= tutorial-4
LOCAL_SRC_FILES:= tutorial-4.c
LOCAL_SHARED_LIBRARIES:= gstreamer_android
LOCAL_LDLIBS:= -llog -landroid
include $(BUILD_SHARED_LIBRARY)

ifndef GSTREAMER_SDK_ROOT $ b $

GSTREAMER_SDK_ROOT:= $ / gst-android / ndk-build /
include $(GSTREAMER_NDK_BUILD_PATH)/plugins.mk
GSTREAMER_PLUGINS:= $(GSTREAMER_PLUGINS_CORE)$(GSTREAMER_PLUGINS_PLAYBACK)$(GSTREAMER_PLUGINS_CODECS)$(GSTREAMER_PLUGINS_NET)$(GSTREAMER_PLUGINS_SYS)$ (GSTREAMER_PLUGINS_NET_RESTRICTED)
GSTREAMER_EXTRA_DEPS:= gstreamer-interfaces-0.10 gstreamer-video-0.10
in clude $(GSTREAMER_NDK_BUILD_PATH)/gstreamer.mk


解决方案

移动到AS,但保持NDK构建传统的方式。我的主要观点是,实验插件仍然是一个移动目标:DSL一直在变化,其局限性需要随着实验插件的每一个版本而变化。第二个原因是3 rd 派对工具,如Fabric将无法使用实验插件。



对于非实验性插件,您可以在 build.gradle 中使用以下部分:

  def ndkBuild = android.ndkDirectory 
import org.apache.tools.ant.taskdefs.condition.Os
if(Os.isFamily(Os.FAMILY_WINDOWS)){
ndkBuild + ='.cmd'
}

task buildNative(type:Exec,description:'通过NDK编译JNI源代码){
commandLine'$ ndkBuild','NDK_PROJECT_PATH =$ jniSrc / ..'
}

task cleanNative(type:Exec,description:'Clean JNI object files'){
commandLine'$ ndkBuild','clean','NDK_PROJECT_PATH =$ jniSrc / ..'


clean.dependsOn'cleanNative'

tasks.withType(JavaCompile){
compileTask - > compileTask.dependsOn buildNative
}

tasks.all {
task - > if(task.name.contains('compileDebugNdk')|| task.name.contains('compileReleaseNdk'))task.enabled = false
}


I have a perfectly working android project in Eclipse, the project includes NDK support and uses Gstreamer. When I migrate the project from Eclipse to Android Studio all sorts of problems pop up, and I just cant successfully compile the project.

I did a thorough research on each and every error I've encountered but still couldn't compile and run the project on android studio.

https://drive.google.com/file/d/0B_euzgSjTAqcQngwbzR1cXY0MkU/view?usp=sharing

A link to the working Eclipse project, I hope someone could direct me on the right way.

This is the import summary:

ECLIPSE ANDROID PROJECT IMPORT SUMMARY

Ignored Files:

The following files were not copied into the new Gradle project; you should evaluate whether these are still needed in your project and if so manually move them:

  • .externalToolBuilders\
  • .externalToolBuilders\Wiz.launch
  • gst-build\
  • gst-build\gstreamer_android.c
  • gst-build\gstreamer_android.o

Replaced Jars with Dependencies:

The importer recognized the following .jar files as third party libraries and replaced them with Gradle dependencies instead. This has the advantage that more explicit version information is known, and the libraries can be updated automatically. However, it is possible that the .jar file in your project was of an older version than the dependency we picked, which could render the project not compileable. You can disable the jar replacement in the import wizard and try again:

android-support-v4.jar => com.android.support:support-v4:23.3.0

Moved Files:

Android Gradle projects use a different directory structure than ADT Eclipse projects. Here's how the projects were restructured:

  • AndroidManifest.xml => app\src\main\AndroidManifest.xml
  • assets\ => app\src\main\assets\
  • jni\ => app\src\main\jni\
  • libs\armeabi\libavcodec.so => app\src\main\jniLibs\armeabi\libavcodec.so
  • libs\armeabi\libavdevice.so => app\src\main\jniLibs\armeabi\libavdevice.so
  • libs\armeabi\libavfilter.so => app\src\main\jniLibs\armeabi\libavfilter.so
  • libs\armeabi\libavformat.so => app\src\main\jniLibs\armeabi\libavformat.so
  • libs\armeabi\libavutil.so => app\src\main\jniLibs\armeabi\libavutil.so
  • libs\armeabi\libgstreamer_android.so => app\src\main\jniLibs\armeabi\libgstreamer_android.so
  • libs\armeabi\libjniARToolKitPlus.so => app\src\main\jniLibs\armeabi\libjniARToolKitPlus.so
  • libs\armeabi\libjniavcodec.so => app\src\main\jniLibs\armeabi\libjniavcodec.so
  • libs\armeabi\libjniavdevice.so => app\src\main\jniLibs\armeabi\libjniavdevice.so
  • libs\armeabi\libjniavfilter.so => app\src\main\jniLibs\armeabi\libjniavfilter.so
  • libs\armeabi\libjniavformat.so => app\src\main\jniLibs\armeabi\libjniavformat.so
  • libs\armeabi\libjniavutil.so => app\src\main\jniLibs\armeabi\libjniavutil.so
  • libs\armeabi\libjnicvkernels.so => app\src\main\jniLibs\armeabi\libjnicvkernels.so
  • libs\armeabi\libjniopencv_calib3d.so => app\src\main\jniLibs\armeabi\libjniopencv_calib3d.so
  • libs\armeabi\libjniopencv_contrib.so => app\src\main\jniLibs\armeabi\libjniopencv_contrib.so
  • libs\armeabi\libjniopencv_core.so => app\src\main\jniLibs\armeabi\libjniopencv_core.so
  • libs\armeabi\libjniopencv_features2d.so => app\src\main\jniLibs\armeabi\libjniopencv_features2d.so
  • libs\armeabi\libjniopencv_flann.so => app\src\main\jniLibs\armeabi\libjniopencv_flann.so
  • libs\armeabi\libjniopencv_highgui.so => app\src\main\jniLibs\armeabi\libjniopencv_highgui.so
  • libs\armeabi\libjniopencv_imgproc.so => app\src\main\jniLibs\armeabi\libjniopencv_imgproc.so
  • libs\armeabi\libjniopencv_legacy.so => app\src\main\jniLibs\armeabi\libjniopencv_legacy.so
  • libs\armeabi\libjniopencv_ml.so => app\src\main\jniLibs\armeabi\libjniopencv_ml.so
  • libs\armeabi\libjniopencv_nonfree.so => app\src\main\jniLibs\armeabi\libjniopencv_nonfree.so
  • libs\armeabi\libjniopencv_objdetect.so => app\src\main\jniLibs\armeabi\libjniopencv_objdetect.so
  • libs\armeabi\libjniopencv_photo.so => app\src\main\jniLibs\armeabi\libjniopencv_photo.so
  • libs\armeabi\libjniopencv_stitching.so => app\src\main\jniLibs\armeabi\libjniopencv_stitching.so
  • libs\armeabi\libjniopencv_video.so => app\src\main\jniLibs\armeabi\libjniopencv_video.so
  • libs\armeabi\libjniopencv_videostab.so => app\src\main\jniLibs\armeabi\libjniopencv_videostab.so
  • libs\armeabi\libjnipostproc.so => app\src\main\jniLibs\armeabi\libjnipostproc.so
  • libs\armeabi\libjniswresample.so => app\src\main\jniLibs\armeabi\libjniswresample.so
  • libs\armeabi\libjniswscale.so => app\src\main\jniLibs\armeabi\libjniswscale.so
  • libs\armeabi\libopencv_calib3d.so => app\src\main\jniLibs\armeabi\libopencv_calib3d.so
  • libs\armeabi\libopencv_contrib.so => app\src\main\jniLibs\armeabi\libopencv_contrib.so
  • libs\armeabi\libopencv_core.so => app\src\main\jniLibs\armeabi\libopencv_core.so
  • libs\armeabi\libopencv_features2d.so => app\src\main\jniLibs\armeabi\libopencv_features2d.so
  • libs\armeabi\libopencv_flann.so => app\src\main\jniLibs\armeabi\libopencv_flann.so
  • libs\armeabi\libopencv_highgui.so => app\src\main\jniLibs\armeabi\libopencv_highgui.so
  • libs\armeabi\libopencv_imgproc.so => app\src\main\jniLibs\armeabi\libopencv_imgproc.so
  • libs\armeabi\libopencv_info.so => app\src\main\jniLibs\armeabi\libopencv_info.so
  • libs\armeabi\libopencv_legacy.so => app\src\main\jniLibs\armeabi\libopencv_legacy.so
  • libs\armeabi\libopencv_ml.so => app\src\main\jniLibs\armeabi\libopencv_ml.so
  • libs\armeabi\libopencv_nonfree.so => app\src\main\jniLibs\armeabi\libopencv_nonfree.so
  • libs\armeabi\libopencv_objdetect.so => app\src\main\jniLibs\armeabi\libopencv_objdetect.so
  • libs\armeabi\libopencv_photo.so => app\src\main\jniLibs\armeabi\libopencv_photo.so
  • libs\armeabi\libopencv_stitching.so => app\src\main\jniLibs\armeabi\libopencv_stitching.so
  • libs\armeabi\libopencv_ts.so => app\src\main\jniLibs\armeabi\libopencv_ts.so
  • libs\armeabi\libopencv_video.so => app\src\main\jniLibs\armeabi\libopencv_video.so
  • libs\armeabi\libopencv_videostab.so => app\src\main\jniLibs\armeabi\libopencv_videostab.so
  • libs\armeabi\libpostproc.so => app\src\main\jniLibs\armeabi\libpostproc.so
  • libs\armeabi\libswresample.so => app\src\main\jniLibs\armeabi\libswresample.so
  • libs\armeabi\libswscale.so => app\src\main\jniLibs\armeabi\libswscale.so
  • libs\armeabi\libtbb.so => app\src\main\jniLibs\armeabi\libtbb.so
  • libs\javacpp.jar => app\libs\javacpp.jar
  • libs\javacv.jar => app\libs\javacv.jar
  • res\ => app\src\main\res\
  • src\ => app\src\main\java\

Next Steps:

You can now build the project. The Gradle project needs network connectivity to download dependencies.

Bugs:

If for some reason your project does not build, and you determine that it is due to a bug or limitation of the Eclipse to Gradle importer, please file a bug at http://b.android.com with category Component-Tools.

(This import summary is for your information only, and can be deleted after import once you are satisfied with the results.)

Build.Gradle:

apply plugin: 'com.android.model.application'

model {
    android {
        compileSdkVersion = 23
        buildToolsVersion = "23.0.2"

        defaultConfig.with {
            applicationId = "com.gst_sdk_tutorials.tutorial_4"
            minSdkVersion.apiLevel = 17
            targetSdkVersion.apiLevel = 22
        }

    }

    android.ndk {
        moduleName = "tutorial-4"
        cppFlags.addAll(["-I${file("src/main/jni/Common/native_app_glue")}".toString(),
                         "-I${file("src/main/jni/Common/cpufeatures")}".toString(),
                         "-I${file("src/main/jni/Common/ndk_helper")}".toString()])
        ldLibs.addAll(["android", "EGL", "GLESv2", "dl", "log", "atomic"])
        stl     = "c++_static"
    }
    // jni is the default dir; config this if yours is in different directory
    android.sources {
        main {
            jni {
                source {
                    srcDirs 'src/main/jni'
                }
            }
        }
    }
    android.buildTypes {
        release {
            minifyEnabled = false
            proguardFiles.add(file('proguard-rules.txt'))
        }
    }
    // Turn on hard float support in armeabi-v7a
    android.abis {
        create("armeabi-v7a") {
            cppFlags.addAll(["-mhard-float", "-D_NDK_MATH_NO_SOFTFP=1", "-mfloat-abi=hard"])
            ldLibs.add("m_hard")
            ldFlags.add("-Wl,--no-warn-mismatch")
        }
    }
    android.productFlavors {
        create ("arm7") {
            ndk.abiFilters.add("armeabi-v7a")
        }
        create ("arm8") {
            ndk.abiFilters.add("arm64-v8a")
        }
        create ("x86-32") {
            ndk.abiFilters.add("x86")
        }
        // for detailed abiFilter descriptions, refer to "Supported ABIs" @
        // https://developer.android.com/ndk/guides/abis.html#sa
        // build one including all productFlavors
        create("fat")
    }
}

dependencies {
    compile 'com.android.support:support-v4:23.3.0'
    compile files('libs/javacpp.jar')
    compile files('libs/javacv.jar')
}

local.properties:

ndk.dir=C\:\\Users\\wiz\\Downloads\\android-ndk-r9d
sdk.dir=D\:\\sdk

.c file:(not complete due to character limit)

#include <string.h>
#include <jni.h>
#include <android/log.h>
#include <android/native_window.h>
#include <android/native_window_jni.h>
#include <gst/gst.h>
#include <gst/interfaces/xoverlay.h>
#include <gst/video/video.h>
#include <pthread.h>

GST_DEBUG_CATEGORY_STATIC (debug_category);
#define GST_CAT_DEFAULT debug_category

/*
 * These macros provide a way to store the native pointer to CustomData, which might be 32 or 64 bits, into
 * a jlong, which is always 64 bits, without warnings.
 */
#if GLIB_SIZEOF_VOID_P == 8
# define GET_CUSTOM_DATA(env, thiz, fieldID) (CustomData *)(*env)->GetLongField (env, thiz, fieldID)
# define SET_CUSTOM_DATA(env, thiz, fieldID, data) (*env)->SetLongField (env, thiz, fieldID, (jlong)data)
#else
# define GET_CUSTOM_DATA(env, thiz, fieldID) (CustomData *)(jint)(*env)->GetLongField (env, thiz, fieldID)
# define SET_CUSTOM_DATA(env, thiz, fieldID, data) (*env)->SetLongField (env, thiz, fieldID, (jlong)(jint)data)
#endif

/* Do not allow seeks to be performed closer than this distance. It is visually useless, and will probably
 * confuse some demuxers. */
#define SEEK_MIN_DELAY (500 * GST_MSECOND)

/* Structure to contain all our information, so we can pass it to callbacks */
typedef struct _CustomData {
  jobject app;                  /* Application instance, used to call its methods. A global reference is kept. */
  GstElement *pipeline;         /* The running pipeline */
  GMainContext *context;        /* GLib context used to run the main loop */
  GMainLoop *main_loop;         /* GLib main loop */
  gboolean initialized;         /* To avoid informing the UI multiple times about the initialization */
  ANativeWindow *native_window; /* The Android native window where video will be rendered */
  GstState state;               /* Current pipeline state */
  GstState target_state;        /* Desired pipeline state, to be set once buffering is complete */
  gint64 duration;              /* Cached clip duration */
  gint64 desired_position;      /* Position to seek to, once the pipeline is running */
  GstClockTime last_seek_time;  /* For seeking overflow prevention (throttling) */
  gboolean is_live;             /* Live streams do not use buffering */
} CustomData;

/* playbin2 flags */
typedef enum {
  GST_PLAY_FLAG_TEXT = (1 << 2)  /* We want subtitle output */
} GstPlayFlags;

/* These global variables cache values which are not changing during execution */
static pthread_t gst_app_thread;
static pthread_key_t current_jni_env;
static JavaVM *java_vm;
static jfieldID custom_data_field_id;
static jmethodID set_message_method_id;
static jmethodID set_current_position_method_id;
static jmethodID on_gstreamer_initialized_method_id;
static jmethodID on_media_size_changed_method_id;

/*
 * Private methods
 */

/* Register this thread with the VM */
static JNIEnv *attach_current_thread (void) {
  JNIEnv *env;
  JavaVMAttachArgs args;

  GST_DEBUG ("Attaching thread %p", g_thread_self ());
  args.version = JNI_VERSION_1_4;
  args.name = NULL;
  args.group = NULL;

  if ((*java_vm)->AttachCurrentThread (java_vm, &env, &args) < 0) {
    GST_ERROR ("Failed to attach current thread");
    return NULL;
  }

  return env;
}

/* Unregister this thread from the VM */
static void detach_current_thread (void *env) {
  GST_DEBUG ("Detaching thread %p", g_thread_self ());
  (*java_vm)->DetachCurrentThread (java_vm);
}

/* Retrieve the JNI environment for this thread */
static JNIEnv *get_jni_env (void) {
  JNIEnv *env;

  if ((env = pthread_getspecific (current_jni_env)) == NULL) {
    env = attach_current_thread ();
    pthread_setspecific (current_jni_env, env);
  }

  return env;
}

android.mk before import:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := tutorial-4
LOCAL_SRC_FILES := tutorial-4.c
LOCAL_SHARED_LIBRARIES := gstreamer_android
LOCAL_LDLIBS := -llog -landroid
include $(BUILD_SHARED_LIBRARY)

ifndef GSTREAMER_SDK_ROOT
ifndef GSTREAMER_SDK_ROOT_ANDROID
$(error GSTREAMER_SDK_ROOT_ANDROID is not defined!)
endif
GSTREAMER_SDK_ROOT        := $(GSTREAMER_SDK_ROOT_ANDROID)
endif
GSTREAMER_NDK_BUILD_PATH  := $(GSTREAMER_SDK_ROOT)/share/gst-android/ndk-build/
include $(GSTREAMER_NDK_BUILD_PATH)/plugins.mk
GSTREAMER_PLUGINS         := $(GSTREAMER_PLUGINS_CORE) $(GSTREAMER_PLUGINS_PLAYBACK) $(GSTREAMER_PLUGINS_CODECS) $(GSTREAMER_PLUGINS_NET) $(GSTREAMER_PLUGINS_SYS) $(GSTREAMER_PLUGINS_NET_RESTRICTED) 
GSTREAMER_EXTRA_DEPS      := gstreamer-interfaces-0.10 gstreamer-video-0.10
include $(GSTREAMER_NDK_BUILD_PATH)/gstreamer.mk

解决方案

I suggest to move to AS but keep the NDK build "the traditional way". My main argument to defend this approach is that the experimental plugin is still a "moving target": the DSL changes all the time, and its limitations require workarounds that change with every release of the experimental plugin. The second reason is that 3rd party tools like Fabric will not work with the experimental plugin.

For the non-experimental plugin, you can use the following piece in build.gradle:

def ndkBuild = android.ndkDirectory
import org.apache.tools.ant.taskdefs.condition.Os
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
    ndkBuild += '.cmd'
}

task buildNative(type: Exec, description: 'Compile JNI source via NDK') {
    commandLine '$ndkBuild', 'NDK_PROJECT_PATH="$jniSrc/..'
}

task cleanNative(type: Exec, description: 'Clean JNI object files') {
    commandLine '$ndkBuild', 'clean', 'NDK_PROJECT_PATH="$jniSrc/..'
}

clean.dependsOn 'cleanNative'

tasks.withType(JavaCompile) {
    compileTask -> compileTask.dependsOn buildNative
}

tasks.all {
    task -> if (task.name.contains('compileDebugNdk') || task.name.contains('compileReleaseNdk')) task.enabled = false
}

这篇关于将NDK和Gstreamer使用的Eclipse Android项目迁移到Android Studio的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆