Ubuntu 11.10 - PDK, NDK 설치

Programming/안드로이드 2013.09.27 11:18 Posted by 파란크리스마스

다운로드

http://old-releases.ubuntu.com/releases/oneiric/

NDK 다운로드

http://developer.android.com/tools/sdk/ndk/index.html

SSH 서버 설치
http://pirtaja.tistory.com/9

$ sudo apt-get install openssh-server
$ sudo /etc/init.d/ssh restart

jdk 1.6 설치 (Gingerbread and newer)
Installing Java6 JDK on Ubuntu 11.10

$ sudo add-apt-repository ppa:ferramroberto/java
$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk sun-java6-plugin

.bashrc 내용 추가

# Java Setting
export JAVA_HOME=/usr/lib/jvm/java-6-sun
export ANDROID_JAVA_HOME=$JAVA_HOME

Android PDK 빌드 환경 구축 (64Bit OS)
http://source.android.com/source/initializing.html
[Android/안드로이드] Ubuntu에서 E: Package 'lib32readline5-dev' has no installation candidate. 발생시 대처 방법.

$ sudo apt-get install git-core gnupg flex bison gperf build-essential \
  zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs \
  x11proto-core-dev libx11-dev lib32readline-gplv2-dev lib32z-dev \
  libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown \
  libxml2-utils xsltproc

Libx11-dev:i386 설치

$ sudo apt-get install libx11-dev:i386

repo 스크립트 다운로드
[Android/안드로이드] 64bit Ubuntu Android ICS Source 다운받기

$ mkdir ~/bin
$ PATH=~/bin:$PATH
$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
$ chmod a+x ~/bin/repo

저장소 초기화

$ sudo mkdir /opt/android-source
$ cd /opt/android-source
$ sudo chown test:test .            <-- 옵션
$ repo init -u https://android.googlesource.com/platform/manifest
$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.3_r1

소스 내려 받기

$ repo sync

안드로이드 소스 전체빌드
[안드로이드] 안드로이드 소스 전체빌드 해보기
안드로이드 빌드하기

안드로이드 소스 빌드

$ cd /opt/android-source
$ make

빌드 오류 해결법

android build error 해결법
ICS Source download
slang_rs_export_foreach.cpp , error : variable ‘ParamName’ set but not used
Ubuntu 11.10 ics build error

make: *** [out/host/linux-x86/obj/EXECUTABLES/obbtool_intermediates/Main.o] Error 1

$ vi build/core/combo/HOST_linux-x86.mk
#HOST_GLOBAL_CFLAGS += -D_FORTIFY_SOURCE=0
HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0

make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libGLcommon_intermediates/GLDispatch.o] Error 1

$ sudo apt-get install mesa-common-dev

make: *** [out/host/linux-x86/obj/EXECUTABLES/llvm-rs-cc_intermediates/slang_rs_export_foreach.o] Error 1

$ vi frameworks/compile/slang/Android.mk
#local_cflags_for_slang := -Wno-sign-promo -Wall -Wno-unused-parameter -Werror
local_cflags_for_slang := -Wno-sign-promo -Wall -Wno-unused-parameter

make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/liboprofile_pp_intermediates/arrange_profiles.o] Error 1

external/oprofile/libpp/format_output.h 파일의 94번행

-   mutable counts_t & counts;
+   counts_t & counts;

make: *** [out/host/linux-x86/obj/EXECUTABLES/test-librsloader_intermediates/test-librsloader] Error 1

external/llvm/llvm-host-build.mk 내용 추가

+   LOCAL_LDLIBS := -lpthread -ldl

make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libgtest_host_intermediates/gtest-all.o] Error 1

vi external/gtest/include/gtest/internal/gtest-param-util.h 내용추가

#include <cstddef>

make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libMesa_intermediates/src/glsl/linker.o] Error 1

vi external/mesa3d/src/glsl/linker.cpp 내용추가

#include <stddef.h>

make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libmtp_intermediates/MtpDevice.o] Error 1

vi frameworks/base/media/mtp/MtpDevice.cpp 수정

-   int fd = ::open(destPath, O_RDWR | O_CREAT | O_TRUNC);
+   int fd = ::open(destPath, O_RDWR | O_CREAT | O_TRUNC, 0777);

Android NDK(C/C++) 설치

http://developer.android.com/tools/sdk/ndk/index.html

$ sudo mv android-ndk-r9-linux-x86_64.tar.bz2 /opt
$ sudo tar xvf android-ndk-r9-linux-x86_64.tar.bz2

.profile-ndk 파일 작성

export ANDROID_NDK_ROOT=/opt/android-ndk-r9
export NDK_TOOLCHAIN_VERSION=4.6
export TOOLCHAIN=/opt/android-9-toolchain

export PATH=$TOOLCHAIN/bin:$PATH

.profile-ndk 실행 (NDK 빌드시 사용)

$ chmod a+x .profile-ndk 
$ source .profile-ndk

ToolChain 만들기

$ $ANDROID_NDK_ROOT/build/tools/make-standalone-toolchain.sh \
--toolchain=arm-linux-androideabi-4.6 \
--ndk-dir=$ANDROID_NDK_ROOT \
--install-dir=$TOOLCHAIN \
--platform=android-9
$ sudo chown test:test -hR /opt/android-9-toolchain

신고

HttpCallUtils

Programming/안드로이드 2013.05.03 16:54 Posted by 파란크리스마스

출처 : android.os.NetworkOnMainThreadException 예외가 발생했을 경우
android.os.NetworkOnMainThreadException
http://aroundck.tistory.com/1240

사용예

        if(android.os.Build.VERSION.SDK_INT > 9) {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }
        
        String test;
		try {
			test = HttpCallUtils.call("aaa", "bbb");
			System.out.println("test = " + test);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

HttpCallUtils

package com.test;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.params.CoreProtocolPNames;
import org.apache.http.params.HttpParams;

public class HttpCallUtils {

	private static String url = "https://test.com/login_check.php";
	private static String key_user = "mb_id";
	private static String key_password = "mb_password";	
	
	/*
	public static void main(String[] args) throws Exception {
		String test = HttpCallUtils.call("aaa", "bbb");
		System.out.println("test = " + test);
	}
	*/
	
	public static String call(String parma1, String param2) throws Exception {
		
		HttpClient client = new DefaultHttpClient();
		HttpPost post = new HttpPost(url);

		HttpParams params = client.getParams();
		params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION,HttpVersion.HTTP_1_1);
		params.setParameter(CoreConnectionPNames.SO_TIMEOUT, new Integer(15000));
		params.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, new Integer(15000));

		ArrayList<BasicNameValuePair> nameValuePairs = new ArrayList<BasicNameValuePair>();
		nameValuePairs.add(new BasicNameValuePair(key_user, parma1));
		nameValuePairs.add(new BasicNameValuePair(key_password, param2));
		UrlEncodedFormEntity entityRequest = new UrlEncodedFormEntity(nameValuePairs, "UTF-8");
		post.setEntity(entityRequest);
		
		//
		HttpResponse response = client.execute(post);
		
		StringBuffer sb = new StringBuffer();

		// Examine the response status
		System.out.println(response.getStatusLine());

		// Get hold of the response entity
		HttpEntity entity = response.getEntity();

		// If the response does not enclose an entity, there is no need
		// to worry about connection release
		if (entity != null) {
			InputStream instream = entity.getContent();
			try {
				BufferedReader reader = new BufferedReader(new InputStreamReader(instream));
				// do something useful with the response
				String line;
				while ((line = reader.readLine()) != null)
					sb.append(line+"\n");
			} catch (Exception ex) {
				ex.printStackTrace();
			} finally {
				instream.close();
			}
		}	
		return sb.toString();
	}	
}

 

신고

Android NDK - openssl 컴파일 하기

Programming/안드로이드 2013.04.03 10:40 Posted by 파란크리스마스

출처 : 안드로이드 c/c++ 개발환경 구축

Mac 환경에서 make-standalone-toolchain.sh 로 toolchain 사용해서 openssl 컴파일 해보았습니다.

컴파일 버전

openssl-1.0.1e.tar.gz

환경

Makefile 수정

추가

CROSS  = $(TOOLCHAIN)/bin/arm-linux-androideabi-
INCDIR = $(TOOLCHAIN)/sysroot/usr/include
LIBDIR = $(TOOLCHAIN)/sysroot/usr/lib

수정

CC= $(CROSS)gcc
AR= $(CROSS)ar $(ARFLAGS) r
RANLIB= $(CROSS)ranlib
NM= $(CROSS)nm

결과

테스트

Makefile

Makefile

-----------------------

libjson 파일컴파일

추가

CROSS  = $(TOOLCHAIN)/bin/arm-linux-androideabi-
INCDIR = $(TOOLCHAIN)/sysroot/usr/include
LIBDIR = $(TOOLCHAIN)/sysroot/usr/lib

수정

# Variables
prefix          = $(TOOLCHAIN)/sysroot/usr
exec_prefix     = $(prefix)
libdir          = lib
includedir      = include
srcdir          = _internal/Source
CXX             = $(CROSS)c++
AR              = $(CROSS)ar
PIC             = PIC
BUILD_TYPE      = "default"

신고

안드로이드 - 정적 라이브러리 NDK 빌드

Programming/안드로이드 2012.09.07 01:22 Posted by 파란크리스마스

이전 글에서 만든 정적 라이브러리를 이용해서 안드로이드 ndk 컴파일, 
안드로이드에서 실행해보는 것을 정리보았습니다.

testlibjni.h

#include <jni.h>

#ifndef _Included_com_example_testlib_TestLib
#define _Included_com_example_testlib_TestLib
#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT jstring JNICALL Java_com_example_testlib_TestLib_get_1version(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

testlibjni.cpp

#include "testlib.h"
#include <jni.h>
#include "testlibjni.h"

JNIEXPORT jstring JNICALL Java_com_example_testlib_TestLib_get_1version(JNIEnv *env, jobject jobj)
{
    return env->NewStringUTF(get_version());
}

Android.mk

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := testlib
LOCAL_SRC_FILES := ../../testlib/src/testlib.cpp
LOCAL_C_INCLUDES := \
   /cygdrive/c/Android/workspaceCDT/testlib/inc \
   $(call include-path-for, graphics corecg)
include $(BUILD_STATIC_LIBRARY)

# JNI
include $(CLEAR_VARS)
LOCAL_MODULE    := testlibjni
LOCAL_SRC_FILES := testlibjni.cpp
LOCAL_STATIC_LIBRARIES := testlib
LOCAL_C_INCLUDES := \
   /cygdrive/c/Android/workspaceCDT/testlib/inc \
   $(call include-path-for, graphics corecg)
include $(BUILD_SHARED_LIBRARY)

Application.mk

APP_STL := stlport_static
STLPORT_FORCE_REBUILD := true 

ndk-build

 

안드로이드 프로젝트 생성 

TestLib.java

package com.example.testlib;

public class TestLib {
	static {
		System.loadLibrary("testlibjni");
	}
	
	public native static String get_version();
}

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:padding="@dimen/padding_medium"
        android:text="@string/hello_world"
        tools:context=".MainActivity" 
        android:id="@+id/edtTitle" />

</RelativeLayout>

MainActivity.java

package com.example.testlib_android;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.TextView;

import com.example.testlib.TestLib;

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        TextView edtTitle = (TextView) findViewById(R.id.edtTitle);
        edtTitle.setText(TestLib.get_version());
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
    
}

실행결과

 

 

신고

player

Programming/안드로이드 2012.09.03 01:05 Posted by 파란크리스마스

gplayer.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <!--
	<SurfaceView 
	    android:id="@+id/gplayer_surfaceview"
		android:layout_height="fill_parent" 
		android:layout_width="fill_parent">
	</SurfaceView>
	-->
	
    <com.grubin.main.GrubinVideoView
        android:id="@+id/gplayer_surfaceview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
    </com.grubin.main.GrubinVideoView>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="top"
        android:orientation="vertical" >

        <ImageButton
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/btnBack"
            style="@style/MediaButton.Back"
            android:layout_gravity="right"
            android:layout_margin="20dip" />

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:orientation="vertical" />

        <LinearLayout
            android:id="@+id/layoutController"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" />
    </LinearLayout>

</FrameLayout>

VideoController.java

package com.grubin.main;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.LinearLayout;

public class VideoController extends MediaController2 {

	private Button searchButton;
	
	private ImageButton mPushButton;
	
	private View.OnClickListener mPushListener;
	
	Context _context;

	private int screenWidth;

	private int screenHeight;
	
	public VideoController(Context context, boolean useFastForward, LinearLayout layout) {
		super(context, useFastForward, layout);
		_context = context;
	}
	
	public VideoController(Context context, AttributeSet attrs) {
		super(context, attrs);
		_context = context;
	}
	
	public VideoController(Context context, LinearLayout layout) {
		super(context, layout);
		_context = context;    
	}
	
	public void setScreenSize(int screenWidth, int screenHeight) {
		this.screenWidth = screenWidth;
		this.screenHeight = screenHeight;
	}

	@Override 
	 public void setAnchorView(View view) {
	     super.setAnchorView(view);
	     
	 		LinearLayout L1 = (LinearLayout) getChildAt(0);
			for (int i = 0; i < L1.getChildCount(); i++) {
				View v = L1.getChildAt(i);
				if (v instanceof LinearLayout) {
					LinearLayout buttons = (LinearLayout) v;
					buttons.addView(makePushButton(L1));
					break;
				}
			}
	     
	     /**
	      * 0 : 컨트롤러 전체
	      * 1 : 컨트롤 버튼
	      * 2 : 탐색 바
	      */
	     //this.getc
	     
	     /*
	     LinearLayout layout = (LinearLayout) getChildAt(0);
	     // LinearLayout button = (LinearLayout)layout.getChildAt(1);
	     // LinearLayout seek = (LinearLayout)layout.getChildAt(2);
	     
	     //view.getParent()
	     
	     LayoutInflater inf = (LayoutInflater) _context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	     LinearLayout linear = (LinearLayout) inf.inflate(R.layout.gplayer_controller, null);
	     layout.addView(linear, 0);
	     */
	}


	/*
	@Override
	public void hide() {
	}
	*/
	
	
	/**
	 * Super ugly hack
	 */
	public void extend() {
		LinearLayout L1 = (LinearLayout) getChildAt(0);
		for (int i = 0; i < L1.getChildCount(); i++) {
			View v = L1.getChildAt(i);
			if (v instanceof LinearLayout) {
				LinearLayout buttons = (LinearLayout) v;
				buttons.addView(makePushButton(L1));
				break;
			}
		}
	}

	protected View makePushButton(ViewGroup parent) {
		LayoutInflater inflate = (LayoutInflater) LayoutInflater.from(_context);
		mPushButton = (ImageButton) inflate.inflate(R.layout.push_button, parent,	false);
		if (mPushListener != null)
			mPushButton.setOnClickListener(mPushListener);
		return mPushButton;
	}  

	public void setPushListener(View.OnClickListener push) {
		mPushListener = push;
		if (mPushButton != null) {
			mPushButton.setOnClickListener(mPushListener);
		}
	}
}

MainActivity.java

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.gplayer);
		
		//
		getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

		//
		surfaceView = (GrubinVideoView) findViewById(R.id.gplayer_surfaceview);
		surfaceHolder = surfaceView.getHolder();
		surfaceHolder.addCallback(this);
		surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

		mediaPlayer = new MediaPlayer();

		mediaPlayer.setOnCompletionListener(this);
		mediaPlayer.setOnErrorListener(this);
		mediaPlayer.setOnInfoListener(this);
		mediaPlayer.setOnPreparedListener(this);
		mediaPlayer.setOnSeekCompleteListener(this);
		mediaPlayer.setOnVideoSizeChangedListener(this);
		
		btnBack = (ImageButton) findViewById(R.id.btnBack);
		btnBack.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) {
      	GPlayer.this.finish();
      } 
		});

		mediaController = (new VideoController(this, (LinearLayout)findViewById(R.id.layoutController)) {
			@Override 
	    public void hide() {
				btnBack.setVisibility(View.INVISIBLE);
				super.hide();
	    }
		});
		
		mediaController.setPushListener(new View.OnClickListener() { 
      public void onClick(View v) {
      	GPlayer.this.finish();
      } 
		});

		Intent intent = getIntent();
		playURI = intent.getStringExtra("url");
		try {
			mediaPlayer.setDataSource(playURI);
		} catch (IllegalArgumentException e) {
			Log.v(LOGTAG, e.getMessage());
			finish();
		} catch (IllegalStateException e) {
			Log.v(LOGTAG, e.getMessage());
			finish();
		} catch (IOException e) {
			Log.v(LOGTAG, e.getMessage());
			finish();
		}
		currentDisplay = getWindowManager().getDefaultDisplay();		
		
		
		//
		mediaController.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) {
      	GPlayer.this.finish();
      } 
		});
	}
	
	@Override
	public boolean onTouchEvent(MotionEvent ev) {
		
		Log.i("xxx", "onTouchEvent=" + ev.getAction());
		
		if(ev.getAction() == MotionEvent.ACTION_DOWN) {
			
			/*
			Toast.makeText(this, "ev.getX()="+ev.getX() + "/" + btnBack.getLeft(), Toast.LENGTH_SHORT).show();
			*/
			
			/*
			Toast.makeText(this, "btnBack.isShown()="+btnBack.isShown(), Toast.LENGTH_SHORT).show();
			if (btnBack.isShown()) {  // if (btnBack.getVisibility() == View.VISIBLE) {
				btnBack.setVisibility(View.INVISIBLE);
			} else {
				btnBack.setVisibility(View.VISIBLE);
			}	
			*/
			
			if (mediaController.isShowing()) {
				mediaController.hide();
				Log.v(LOGTAG, "mediaController.hide()");
			} else {
				try {
					btnBack.setVisibility(View.VISIBLE);
					mediaController.show(10000);
				} catch (Exception e) {
					Log.e(LOGTAG,e.toString(),e);
				}
				Log.v(LOGTAG, "mediaController.show()");
			}
		}
		return false;
	}	
신고

출처 : Android NDK FFmpeg 컴파일 강좌 (1/4)
Android NDK FFmpeg 컴파일 강좌 (4/4)
Android NDK FFmpeg 컴파일 강좌 (3/4)
Android NDK FFmpeg 컴파일 강좌 (2/4)
Android NDK FFmpeg 컴파일 강좌 (새로운 시도)
http://blog.daum.net/hopefullife/209
Android NDK Overview
Android NDK 빌드환경을 사용하지 않는 Makefile
Decoding audio via Android using FFMpeg
OpenMAX AL for ffmpeg
live-converter
read-only stream buffer interface in ffmpeg #1
FFmpeg port for Android ndk
android-ndk-r7 编译 ffmpeg-0.10
Android AudioRecord to FFMPEG encode native AAC
http://www.2cto.com/kf/201201/116171.html
http://pastebin.com/P02Fmw53
AndroidCompile

안드로이드펍에서 남은그루터기, 로봇시대 글을 보고, 컴파일 해보았는데, 작업해야될 부분이 많았어서,
인터넷에서 여러가지 글을 찾아보고, 간단하게 할 수 있는 방법을 찾아 보았습니다.

일주일 동안의 고생한 내용을 정리합니다. 안드로이드펍의 남은그루터기님과, 로봇시대님에게 감사한마음 글로나마 드립니다.

toolchain을 /opt/android-8-toolchain 설치하고, ffmpeg 폴더에 config.sh 파일을 아래와 같이 만들었습니다.
C 드라이브에 ffmpegtmp 폴더를 만들고, 남은그루터기님 처럼 configure 파일은 수정하지 않았습니다.

그리고, 남은그루터기님의 소스를 받아서 rtsp 주소로 실행하면 "Open Movie Error: -2" 라고 나오는데,
지원이 안되는 것으로 알고 있었는데, 프로젝트의 AndroidManifest.xml 파일에 인터넷 접근 권한을 추가 해야  되더군요.
2일이나 고생해서 찾았습니다.

config.sh 파일

export TMPDIR=c:/ffmpegtmp
export ANDROID_ROOT=/opt/android-8-toolchain

./configure --target-os=linux \
--arch=arm \
--enable-cross-compile \
--cc=$ANDROID_ROOT/bin/arm-linux-androideabi-gcc \
--cross-prefix=$ANDROID_ROOT/bin/arm-linux-androideabi- \
--extra-cflags="-marm -march=armv7-a -mfloat-abi=softfp -mfpu=neon" \
--extra-ldflags="-Wl,--fix-cortex-a8" \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-avdevice \
--disable-devices \
--disable-filters \
--disable-yasm \
--enable-network \
--enable-protocol=tcp \
--enable-demuxer=rtsp \
--enable-decoder=h264

남은그루터기님은 각라이브러리 폴더에 Android.mk을 만드셨지만,
config.sh 파일은 만들고 ./config.sh 실행하고 make 컴파일 실행하면,
각 라이브러리 폴더에 .a 파일로 파일이 생성됩니다.
jni 컴파일 할때도 이 라이브러리 파일만 참조 하시면 됩니다.

CPU별 --extra-cflags 추가 플래그

arm v6
    -marm -march=armv6

arm v7vfpv3
    -mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=armv7-a

arm v7vfp
    -mfloat-abi=softfp -mfpu=vfp -marm -march=armv7-a

arm v7n
    -mfloat-abi=softfp -mfpu=neon -marm -march=armv7-a -mtune=cortex-a8

arm v6+vfp
    -DCMP_HAVE_VFP -mfloat-abi=softfp -mfpu=vfp -marm -march=armv6

컴파일

$ ./config.sh

$ make

BasicPlayer.c 수정 - 남은그루터기 소스 원본의 내용 일부

#include "avcodec.h"
#include "avformat.h"
#include "swscale.h"

수정된 소스

#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libswscale/swscale.h"

Application.mk

APP_ABI := armeabi armeabi-v7a
APP_PLATFORM := android-8

Android.mk

# 참조
#      http://berabue.tistory.com/67
#      http://www.newsmth.net/bbsanc.php?path=%2Fgroups%2Fcomp.faq%2FMobileDev%2Fandroid%2FM.1315568907.n0&ap=275

# 컴파일하고자 하는 소스파일 위치를 알려줍니다. Android.mk를 jni에 놔두었으니 프로젝트/jni폴더가 됩니다.
LOCAL_PATH := $(call my-dir)

FFMPEGDIR := D:/Windows/cygwin/home/bluesanta/BluePlayer/jni/ffmpeg

# LOCAL로 시작하는것들을 초기화시킨다고합니다. LOCAL_PATH는 제외.
include $(CLEAR_VARS)

LOCAL_C_INCLUDES := $(FFMPEGDIR)

# List 'cpufeatures' in your list of static library dependencies
LOCAL_STATIC_LIBRARIES := cpufeatures

# 생성될 so파일명입니다.
LOCAL_MODULE    := libbasicplayer

# 컴파일할 소스파일을 추가합니다.  
LOCAL_SRC_FILES := Interface.c BasicPlayer.c

LDFFMPEG = -L$(FFMPEGDIR)/libavformat -L$(FFMPEGDIR)/libavcodec -L$(FFMPEGDIR)/libavutil -L$(FFMPEGDIR)/libswscale
LOCAL_LDLIBS    := $(LDFFMPEG) -lavformat -lswscale -lavcodec -lavutil -lz -lm -llog -ljnigraphics

# 공유 라이브러리를 생성합니다.
include $(BUILD_SHARED_LIBRARY)

# At the end of your Android.mk, import the 'android/cpufeatures'
$(call import-module,android/cpufeatures)

컴파일

$ ndk-build

신고

Android NDK - toolchain 사용 컴파일

Programming/안드로이드 2012.05.24 15:17 Posted by 파란크리스마스

출처 : http://stackoverflow.com/questions/9251747/record-rtsp-stream-with-ffmpeg-libavformat
http://limga.tistory.com/3
http://kaludin.egloos.com/2651893
http://dranger.com/ffmpeg/tutorial01.html
http://dc.csie.ntut.edu.tw/files/DC006lab.pdf
http://www.cantgetnosleep.com/wordpress/?p=111

main.c 파일

#include <stdio.h>

int main(int argc, char* argv[])
{
	printf("Hello Android NDK! \n");	

	return 0;
}

Makefile 파일

TARGET = hello

TOOLCHAIN = D:/Windows/cygwin/opt/android-8-toolchain

CROSS  = $(TOOLCHAIN)/bin/arm-linux-androideabi-
INCDIR = $(TOOLCHAIN)/sysroot/usr/include
LIBDIR = $(TOOLCHAIN)/sysroot/usr/lib

CC 	= $(CROSS)gcc
AR 	= $(CROSS)ar
LD 	= $(CROSS)ld
NM 	= $(CROSS)nm
RANLIB 	= $(CROSS)ranlib
STRIP = $(CROSS)strip

INCLUDE = -I. -I$(INCDIR) 

CFLAGS = -Wall
LDFLAGS = -nostdlib -Wl,--dynamic-linker,"//system/bin/linker" -L$(LIBDIR) -lc -lm -lstdc++ -ldl
#LDFLAGS = -static -lc -lm -lstdc++

# crt 
CRTOBJ = $(LIBDIR)/crtbegin_dynamic.o

# application file
APPSOURCES = main.c
APPOBJS = $(APPSOURCES:.c=.o)

# define the rule
.SUFFIXES:.c .o 

.c.o:
	@echo Compiling: $< 
	$(CC) -c $(CFLAGS)  $(INCLUDE) -o $@ $<

all: app

app: $(APPOBJS)
	@echo Linking: $(TARGET) 
	$(CC) -o $(TARGET) $(APPOBJS) $(CRTOBJ) $(LDFLAGS)
	$(STRIP) -s $(TARGET)

clean:
	@rm -vf $(APPOBJS) $(TARGET) 
	

테스트

 

신고

Android - 일본어 TTS 설치 (SVOX 사용)

Programming/안드로이드 2011.07.04 14:15 Posted by 파란크리스마스
Android 에서 일본어 출력을 위해서 두가지 앱이 설치되어 합니다.

1. Classis Text To Speech - 무료
2. SVOX 일어 언어팩 - 2.99$

설치방법

1. 마켓에서 svox로 검색합니다.

2. 검색된 목록에서 Classis Text To Speech를 선택해서 설치합니다.


3. 다시 1번에서 검색목록에서 SVOX Japanese/日本을 선택해서 설치하십니다.


위에 2개의 앱을 설치 하셨다면 이제 환경 설정에서 TTS 엔진을 변경 하셔야 합니다.

환경설정

1. 환경설정에 들어 가셔서 음성 입력 & 출력을 선택합니다.


3. TTS(text-to-speech) 설정을 선택합니다.


4. SVOX Classic TTS의 체크 박스를 선택합니다.



5. 기본 엔진를 선택합니다.


6. 기본 엔진 목록에서 SVOX Classic TTS을 선택하시면 됩니다.



 

 

신고

Android - OpenCV

Programming/안드로이드 2011.06.27 01:25 Posted by 파란크리스마스
출처 : http://sotddi.tistory.com/tag/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C%20opencv
http://triumphlsh.springnote.com/pages/6620993

1. cygwin 설치

Devel 확장 시킨후 gcc-core, gcc++, make, swig 를 선택하여 설치 한다.





2. Android NDK 설치

다운로드 : http://www.crystax.net/android/ndk-r4.php#download

C:\cygwin\home\[로그인계정] 폴더에
NDK파일(android-ndk-r4-windows-crystax-4.zip)을 다운받아서 압축을 푼다.


3. svn 클라이언트을 이용해서 opencv 파일을 내려받는다.

svn checkout http://android-opencv.googlecode.com/svn/trunk/


4. 빌드 환경 설정

C:\cygwin\home\[로그인계정]\.bashrc 파일 편집

export PATH=$PATH:/home/[로그인계정]/android-ndk-r4-crystax
export ANDROID_NDK_ROOT=/home/[로그인계정]/android-ndk-r4-crystax

 


5. opencv 컴파일




신고

Android - OpenCV

Programming/안드로이드 2011.06.27 01:25 Posted by 파란크리스마스
출처 : http://sotddi.tistory.com/tag/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C%20opencv
http://triumphlsh.springnote.com/pages/6620993

1. cygwin 설치

Devel 확장 시킨후 gcc-core, gcc++, make, swig 를 선택하여 설치 한다.





2. Android NDK 설치

다운로드 : http://www.crystax.net/android/ndk-r4.php#download

C:\cygwin\home\[로그인계정] 폴더에
NDK파일(android-ndk-r4-windows-crystax-4.zip)을 다운받아서 압축을 푼다.


3. svn 클라이언트을 이용해서 opencv 파일을 내려받는다.

svn checkout http://android-opencv.googlecode.com/svn/trunk/


4. 빌드 환경 설정

C:\cygwin\home\[로그인계정]\.bashrc 파일 편집

export PATH=$PATH:/home/[로그인계정]/android-ndk-r4-crystax
export ANDROID_NDK_ROOT=/home/[로그인계정]/android-ndk-r4-crystax

 


5. opencv 컴파일




신고

Android - OpenCV

Programming/안드로이드 2011.06.27 01:25 Posted by 파란크리스마스
출처 : http://sotddi.tistory.com/tag/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C%20opencv
http://triumphlsh.springnote.com/pages/6620993

1. cygwin 설치

Devel 확장 시킨후 gcc-core, gcc++, make, swig 를 선택하여 설치 한다.





2. Android NDK 설치

다운로드 : http://www.crystax.net/android/ndk-r4.php#download

C:\cygwin\home\[로그인계정] 폴더에
NDK파일(android-ndk-r4-windows-crystax-4.zip)을 다운받아서 압축을 푼다.


3. svn 클라이언트을 이용해서 opencv 파일을 내려받는다.

svn checkout http://android-opencv.googlecode.com/svn/trunk/


4. 빌드 환경 설정

C:\cygwin\home\[로그인계정]\.bashrc 파일 편집

export PATH=$PATH:/home/[로그인계정]/android-ndk-r4-crystax
export ANDROID_NDK_ROOT=/home/[로그인계정]/android-ndk-r4-crystax

 


5. opencv 컴파일




신고

Android - ListView / Custom ListView

Programming/안드로이드 2011.01.06 23:31 Posted by 파란크리스마스
ListView 제어를 MVC 모델처럼 BaseAdapter 의 getCount, getView, getItem을 구현하여
List를 보여주는 예제입니다.

ListViewTest.java

ListView를 listview 로 생성하여
BaseAdapter 상속 받아서 구현한 ArrayAdapterExample 객체를
listview.setAdapter()호출하여 listview의 adapter로 설정합니다.
package com.shryu.test;

import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;

public class ListViewTest extends Activity implements OnClickListener {
	
  private TextView text; 

  private ArrayAdapterExample adapter;
	
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.main);
    
    LayoutInflater inflate = LayoutInflater.from(this);
    LinearLayout layout = (LinearLayout)inflate.inflate(R.layout.main, null);
    this.setContentView(layout); 
    
    text = (TextView)findViewById(R.id.TextView02); 
    
    ListView listview = new ListView(this);
    listview.setLayoutParams(new LinearLayout.LayoutParams(
    		LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT)); 
    layout.addView(listview);
    
    adapter = new ArrayAdapterExample(this, R.layout.list_item_1);
    listview.setAdapter(adapter);
  }

  @Override
  public void onClick(View v) {
    Button btn = (Button)v;
    text.setText(btn.getText());
  }
}
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView
    android:id="@+id/TextView02"  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
</LinearLayout>
ArrayAdapterExample.java
package com.shryu.test;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.TextView;

public class ArrayAdapterExample extends BaseAdapter implements Filterable {

	private Context mContext; 
	private int mFieldId = 0;

	public ArrayAdapterExample(Context context, int textViewResourceId) {
		super();
		mContext = context;
		mFieldId = textViewResourceId;
	}

	@Override
	public int getCount() {
		return 100;
	}

	@Override
	public Object getItem(int position) {
		String result = new String(position+"");
		return result;
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		View v = convertView; 
		if (v == null) { 
			LayoutInflater vi = LayoutInflater.from(mContext); 
			v = vi.inflate(R.layout.list_item_1, null);
		}
			
		String value = (String)this.getItem(position); 
		if (value != null) { 
			TextView tt = (TextView) v.findViewById(R.id.TextView01);  
			tt.setText("position = " + value);                        
			Button btn = (Button) v.findViewById(R.id.Button01);  
			btn.setText(value + " 선택"); 
			btn.setOnClickListener((OnClickListener)mContext);    
		}
		return v; 
	}

	@Override
	public Filter getFilter() {
		return null;
	}
}
list_item_1.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="fill_parent"
	android:layout_height="fill_parent">
<TextView android:text="@+id/TextView01" 
	android:id="@+id/TextView01"
	android:layout_width="wrap_content" 
	android:layout_height="wrap_content"/>
<Button android:text="@+id/Button01" 
	android:id="@+id/Button01"
	android:layout_width="wrap_content" 
	android:layout_height="30px"/>
</LinearLayout>
-end-
신고

android - scrollview

Programming/안드로이드 2010.12.25 18:16 Posted by 파란크리스마스

출처 : http://tigerwoods.tistory.com/12
http://vulpecula.tistory.com/3
http://nashorn.tistory.com/74
http://blog.vizpei.kr/94697746
http://www.jopenbusiness.com/tc/oss/entry/Android-ScrollView%EB%A1%9C-%ED%99%94%EB%A9%B4-%EC%8A%A4%ED%81%AC%EB%A1%A4-%EC%B2%98%EB%A6%AC
http://songdroid.blogspot.com/2009/12/linearlayout.html



main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
</LinearLayout>
ScrollViewTest.java

package com.shryu.test;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.RelativeLayout;
import android.widget.ScrollView;
import android.widget.TextView;

public class ScrollViewTest extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.main);
        LayoutInflater inflate = LayoutInflater.from(this);
        LinearLayout layout = (LinearLayout)inflate.inflate(R.layout.main, null);
        this.setContentView(layout);
        
        //
        ScrollView sv = new ScrollView(this);
        sv.setLayoutParams(new RelativeLayout.LayoutParams(
             LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
        layout.addView(sv);
        
        LinearLayout subLayout = new LinearLayout(this);
        subLayout.setLayoutParams(new LinearLayout.LayoutParams(
        		LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, 1.0f));
        subLayout.setOrientation(LinearLayout.VERTICAL);
        subLayout.setPadding(0, 0, 5, 0);
        sv.addView(subLayout);
        
        for (int i=0; i<20; i++) {
          TextView aa = new TextView(this);
          aa.setBackgroundColor(Color.BLUE);
          aa.setText("blue - " + i);
          subLayout.addView(aa);
         
          TextView aa2 = new TextView(this);
          aa2.setBackgroundColor(Color.BLACK);
          aa2.setText("black - " + i);
          subLayout.addView(aa2);
        }
    }
}

 
신고

Android 개발 환경 설치

Programming/안드로이드 2010.09.19 22:01 Posted by 파란크리스마스

출처
http://heny2kawmi.tistory.com/4
http://heny2kawmi.tistory.com/77

다운로드

1. Eclipse 압축풀기

eclipse-java-helios-win32.zip

C:\Android\eclipse 폴더로 압축을 푼다.

2. Eclipse의 실행할 JDK 설정(옵션)

C:\Android\eclipse\eclipse.ini 파일의 상단에 아래의 내용을 추가 한다.

-vm
C:/Android/jdk1.6.0_16/bin/javaw.exe

3. Android SDK 압축풀기

android-sdk_r07-windows.zip

C:\Android\android-sdk-windows 폴더로 압축을 푼다.

4. 환경변수 추가

Path 에 C:\Android\android-sdk-windows\tools 폴더 추가

5. Eclipse용 ADT(Android Development Tools) 플러그인 설치

5.1 Eclipse을 실행한다.

5.2 메뉴 [Help] > [Install New Software...]을 선택한다.



5.3 버튼 [Add...] 선택한다.



5.4 Add Repository 내용 입력

Name : ADT Plugin
Location : https://dl-ssl.google.com/android/eclipse

보안상 접속이 되지 않는 경우 : http://dl-ssl.google.com/android/eclipse 다시 시도 해본다.



5.5 Android DDMS, Android Development Tools 선택하고 버튼 [Next >]을 선택한다.



5.6 버튼 [Next >]을 선택한다.



5.7 라이센스 확인하고  버튼 [Finish]을 선택한다.



5.8 플러그인이 설치가 완료 되면 Eclipse 제시작한다.

6. Eclipse에서 Android SDK 경로 설정

6.1 Eclispe의 메뉴 [Window] > [Preferences]을 선택한다.

6.2 트리에서 [Android]를 선택한다.

6.3 버튼 [Browse...] 선택한다.



6.4 Android SDK가 설치된 경로를 선택한다.



6.5 버튼 [OK선택한다.

7. Android SDK의 Available Packages 설치 하기

7.1 Eclipse의 메뉴 [Window] > [Android SDK and AVD Manager]을 선택한다.



7.2 라이센스등의 하고 버튼 [Install]을 선택한다.



7.3 버튼 [Close]을 선택한다.



7.4 [Virtual Devices] 선택한다.



7.5 버튼 [New]을 선택한다.



7.6 위와 같이 입력한다.



7.7 추가된 [Hello_Android]을 선택하고 버튼 [Start...]을 선택한다.



7.8 버튼 [Launch]을 선택한다.

8. 실행된 Android 에뮬레이터 화면

- end -
신고


 

티스토리 툴바