2018. 6. 5. 13:31














Posted by 허늬
2015. 4. 24. 11:18

몇년 만에 블로그에 손을 대게 되다니;;;;;;

이번 삽질을 통해 몇 가지 알게 된 사실입니다.


1. JNI 함수를 만들 때 매개변수의 개수와 순서에 유의해야 한다.
첫번째 매개변수는 JNIEnv, 두번째 매개변수는 jclass 또는 jobject 여야 한다.
세번째 부터는 사용자가 JNI에서 제공되는 data type 내에서 마음껏(?) 지정할 수 있다.


2. JNI 함수에서 기본 data type의 array(예> int[], byte[] 등)가 아닌 ArrayList를 사용해야 할 땐 다음와 같이 한다.아래 코드는 2중 ArrayList(?)의 형태를 띈 ArrayList<AAA>의 최하위 요소인 test1, test2를 가져오는 코드이다.

  1. // ---------- AAA.java ----------
  2. public class AAA {
  3.         public int itemID;
  4.         public ArrayList<BBB>   bbb;
  5. }
  6.  
  7. // ---------- BBB.java ----------
  8. public class BBB {
  9.         public int test1;
  10.         public int test2;
  11. }
  12.  
  13. // ---------- JNI 함수 호출을 위한 Java Interface ----------
  14. public class Natives {
  15.         public static native void JNICallTest(ArrayList<AAA> list);
  16. }


---------- JNI 함수 구현부 ---------

  1. JNIEXPORT void JNICALL Java_com_test_app_jni_Natives_JNICallTest(JNIEnv *env, jobject thisObj, jobject objArrayListAAA)
  2. {
  3.         // ArrayList<AAA> 형식의 클래스 가져오기
  4.         jclass clsArrayListAAA = env->FindClass("java/util/ArrayList");
  5.  
  6.         // ArrayList의 멤버함수인 size, get을 사용하기 위해 methodID를 가져오기
  7.         // 아래에서 얻어온 메소드ID로 ArrayList<AAA>와 ArrayList<BBB> 등, 모든 ArrayList<type> 형식의 size, get 함수 사용이 가능하다.
  8.         jmethodID midSize = env->GetMethodID(clsArrayListAAA, "size""()I");
  9.         jmethodID midGet = env->GetMethodID(clsArrayListAAA, "get""(I)Ljava/lang/Object;");
  10.  
  11.         // ArrayList<AAA>에서 AAA 클래스 가져오기
  12.         jobject objAAA = env->CallObjectMethod(objArrayListAAA, midGet, 0);
  13.         jclass clsAAA = env->GetObjectClass(objAAA);
  14.  
  15.         // AAA 클래스의 필드 가져오기
  16.         // 필드의 값을 얻어오는 게 아니라, 필드 ID를 얻어와서 나중에 필드의 값을 얻어올 때 사용한다.
  17.         jfieldID fidItemID = env->GetFieldID(clsAAA, "itemID""I");
  18.         jfieldID fidArrayListBBB = env->GetFieldID(clsAAA, "bbb""Ljava/util/ArrayList;");
  19.         jobject objArrayListBBB = env->GetObjectField(objAAA, fidArrayListBBB);
  20.  
  21.         // ArrayList<BBB> 에서 BBB 클래스 가져오기
  22.         jobject objBBB = env->CallObjectMethod(objArrayListBBB, midGet, 0);
  23.         jclass clsBBB = env->GetObjectClass(objBBB);
  24.  
  25.         // BBB 클래스의 필드 가져오기
  26.         jfieldID fidTest1 = env->GetFieldID(classBBB, "test1""I");
  27.         jfieldID fidTest2 = env->GetFieldID(classBBB, "test2""I");
  28.  
  29.         // 중첩 for문으로 ArrayList<AAA>의 모든 하위정보 가져오기
  30.         int lengthAAA = env->CallIntMethod(objArrayListAAA, midSize);
  31.         for(int ii = 0; ii < lengthAAA; ii++)
  32.         {
  33.                 jobject _objAAA = env->CallObjectMethod(objArrayListAAA, midGet, ii);
  34.  
  35.                 int itemID = env->GetIntField(_objAAA, fidItemID);
  36.                 jobject _objArrayListBBB = env->GetObjectField(_objAAA, fidArrayListBBB);
  37.                
  38.                 int lengthBBB = env->CallIntMethod(_objArrayListBBB, midSize);
  39.                 for(int jj = 0; jj < lengthBBB; jj++)
  40.                 {
  41.                         jobject _objBBB = env->CallObjectMethod(_objArrayListBBB, midGet, ii);
  42.                        
  43.                         int test1 = env->GetIntField(_objBBB, fidTest1);
  44.                         int test2 = env->GetIntField(_objBBB, fidTest2);
  45.                        
  46.                         // 이런 loop구조에서는 반드시 해제해주어야 함!!!
  47.                         // 굳이 loop가 아니어도 함수 내에서 많은 양의 jobject나 jclass등을
  48.                         // 가져와서 사용해야 한다면 사용이 끝난 것들은 해제해주는 것이 좋다.
  49.                         env->DeleteLocalRef(_objBBB);
  50.                 }
  51.                
  52.                 // loop 안에서 가져온 것들은 반드시 해제!!
  53.                 // 나중에 Release<type>ArrayElements 형식의 함수와 같이 사용하게 됐을 때
  54.                 // 덜 헷갈리려면 가져올 때와 역순으로 해제해주는 것이 좋다.
  55.                 env->DeleteLocalRef(_objArrayListBBB);
  56.                 env->DeleteLocalRef(_objAAA);
  57.         }
  58.  
  59.         // 이 아래 것들은 함수가 끝나면 자동으로 해제되므로
  60.         // 굳이 해제해주지 않아도 되지만 왠지 모를 찝찝함 때문에 해제 ^^;;
  61.         env->DeleteLocalRef(clsBBB);
  62.         env->DeleteLocalRef(objBBB);
  63.  
  64.         env->DeleteLocalRef(objArrayListBBB);
  65.  
  66.         env->DeleteLocalRef(clsAAA);
  67.         env->DeleteLocalRef(objAAA);
  68.  
  69.         env->DeleteLocalRef(clsArrayListAAA);
  70. }


Posted by 허늬
2010. 8. 9. 11:16


아.. 옛날이여~ 이 때 군대만 아니었더라면 헐리우드 한 번 가보는 거였는데 ㅠ_-

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


한국HP, “You Take Five” 디지털 포토 콘테스트 시상식 개최

 

·         전세계 최대의 디지털 사진 콘테스트 70여개 , 5 여명 참가해 수준 높은 사진 작품들 선보여

·         헐리우드 여행기회와 부상이 수여되는 아태지역 최우수상에 한국인 당선

 

서울, 2004. 7. 15 --- 한국 HP(www.hp.co.kr, 대표:최준근 ) 지난 3 HP 프로젝트 그린라이트* 공동으로 전세계적으로 진행한 “You Take Five” 디지털 포토 콘테스트 시상식이 14 미국 헐리우드에서 개최되고 전세계 그랑프리 지역별 최우수상 수상자가 발표되었다고 밝혔다. 

 

전세계 70 개국에서 6 명이 참여한 이번 포토 콘테스트의 그랑푸리 수상자는 캐나다의 스티브 레메디오스 (36) 아침의 도전이라는 주제의 작품. 여유로운 토요일 아침, 딸이 티비를 보는 대신 아침 햇살이 비치는 창가에 앉아 평화롭게 체스를 두는 모습을 빛을 적절히 활용해 절묘하게 담아낸 작품으로 독창성 표현 능력면에서 높은 평가를 받았다. 세계 최우수 그랑프리 수상자에게는 프로젝트 그린라이트의 차기 독립 영화의 공식 사진 작가 단역배우로 출연하는 기회가 주어지며 HP 디지털 포토그래피 제품 패키지 등이 제공된다.

 

한국 수상작품 시상식은 공동마케팅을 진행한 영화 늑대의 유혹시사회장에서 주인공을 맡은 강동원, 조한선, 이청아, 이천희 등이 참가한 가운데 13 저녁 주공공이 극장에서 개최됐다. 특히 한국 참가자 헌씨가 테디의 감정이라는 작품으로 독창성과 촬영기술, 표현 능력면에서 고루 높은 점수를 받아 “You Take Five” 콘테스트 아태지역 최우수상의 영예를 안았다. 아태지역 최우수상 수상자는 헐리우드에서 열리는 프로젝트 그린라이트 차기작의 시사회에 초대되어 유명 배우들과 함께 레드 카펫을 밟는 영광을 누리게 되는 동시에 HP 디지털 카메라와 포토프린터 패키지 등을 부상으로 받는다.

 

전세계 모든 응모작은 독창성, 촬영 기술, 표현 능력을 기준으로 심사됐으며, 아시아태평양, 미국, 캐나다, 중남미, 유럽/ 중동/ 아프리카 5 지역별로 1명씩 지역별 우승자가 선정되고, 중에서 세계 최우수 그랑프리 수상자가 결정되었다.

 

HP 이미징 프린팅 그룹 김상현 상무는디지털 카메라가 넓게 보급되고 사진 촬영이 생활화되면서 일반인들의 사진 촬영 수준이 프로의 수준에 뒤지지 않는 같다, “향후에도 디지털 포토그래피 생활에 활력을 불어넣을 이벤트를 지속적으로 마련할 계획이라고 밝혔다.

 

‘YOU take Five!’ 포토 콘테스트는 디지털 사진 콘테스트 사상 최대 규모의 대대적인 이벤트로 콘테스트는 HP엔조이 모어컨수머 전략의 일환인 You+HP 글로벌 브랜드 캠페인의 하나로서, 쉽고 재미있는 디지털 포토그래피 체험을 위해 기획되었다. 수상작품과 전세계 참가작은 www.hp.co.kr/you 에서 있다.

 

<아태지역 최우수상 수상작 헌씨의 작품 설명>

 

- 제목: 테디의 감정

- 내용:

버려진 곰인형...

그것은 소녀의 마음을 사로잡았다.

인형에게 동정심을 느낀 소녀는

그 인형이 쓸쓸하지 않도록 친구를 만들어주었다.

 

###

참고사항

* 벤 에플렉과 멧 데이먼, 크리스 무어가 수석 프로듀서를 맡고 있는 프로젝트 그린라이트 (Project Greenlight) Miramax, LivePlant, Bravo사에서 제작된 독특한 영화 콘테스트, TV 다큐먼트 시리즈 또는 장편 영화를 가리키며, 아직 알려지지 않은 재능있는 영화인들에게 헐리우드로의 진출 기회를 준다. 올해 중순 콘테스트에서 당선될 스크린작가와 감독은 12억원의 영화제작비를 부상으로 받아, 여름 또는 이른 가을부터 영화제작에 들어갈 계획이다. 프로젝트 그린라이트 시리즈는 내년 Bravo 방송을 통해 75백만 가구에서 방영될 예정이며, 벤 에플렉과 멧 데이먼, 크리스 무어가 프로젝트 그린라이트의 수석 프로듀서를 맡고 있다.

1)      세계 최우수 그랑프리 시상품 (전세계 1)
- 프로젝트 그린라이트의 차기 독립 영화 촬영장에서 공식 사진 작가로 활동 기회
-
영화에 단역배우로 출연 기회 시사회에서 영화 제작 과정 촬영 사진 전시
- HP
디지털 카메라, 포토프린터 패키지 전문사진작가의 개인지도
-
대상 수상자의 YOUstory 작품이 HP 광고 특집으로 반영

지역별 최우수작 시상품 (4 - 아태/미국/캐나다/남미/유럽중동아프리카 1)
 -
동반 1인까지  4 5일간 헐리우드 여행 항공 티켓 숙박 제공
 - Project Greenlight
시사회에서 스타들과 레드 카펫을 걸을 있는 기회
 - HP
디지털 카메라, 포토프린터 패키지
 -
비공식 칵테일 파티 영화 시사회 초대 

3)  한국 Top 10  시상품 (한국 참여자중 상위 점수를 얻은 10)
- 1(1): HP 포토스마트 945 디지털 카메라, HP PSC 2410 잉크젯 복합기, HP 포토스마트 245 포토 프린터, HP 포토잉크/포토용지 패키지
- 2
(2): HP 포토스마트 945 디지털 카메라, HP 포토스마트 7960 포토프린터, HP 포토잉크/포토용지 패키지
- 3
(3): HP 포토스마트 735 디지털 카메라,HP PSC 2410 잉크젯 복합기, HP 포토잉크/포토용지 패키지
- 4
(4): HP 포토스마트 735 디지털 카메라, HP 포토스마트 245 포토 프린터, HP 포토잉크/포토용지 패키지
- 150 : 사이더스 여름 개봉예정작늑대의 유혹아주 특별한 시사회 티켓 2
 

* 한국 Top 10 전세계 심사기준에 의해 가장 높은 점수를 받은 상위 10명이다

Posted by 허늬
2010. 8. 5. 16:29
 
ClickListener를 강제로 발생시켜야 할 일이 생겼었다.
네이ㄴyun 및 안드로이드 개발자 커뮤니티 3군데를 아무리 뒤져봐도 안 나온다...
질문 글 올려도 답변 안 달린다..

그냥 reference보면서 찾았다.


Button btClose;

... 중략 ...

btClose.setOnClickListener(new ...
중략
...

btClose.performClick();



참~ 쉽죠잉?

※ 저 메소드를 실행하기 위해선
  먼저 해당 버튼에 setOnClickListener를 통해서 OnClickListener가 정의되어 있어야 한다.
 

개발도구 :
Android SDK 2.2, API 8
Eclipse Build id: 20090920-1017 (Galileo)


' > Android' 카테고리의 다른 글

JNI 함수 사용에 관한 삽질과 고찰의 결과 정리  (1) 2015.04.24
Posted by 허늬
2009. 11. 20. 01:16

이제부터 나도 블로거!!
-_-;


스크랩 창고가 된 네이버블로그에게는 미안;;
티스토리가 더 좋은걸-_;;


그리고 티스토리 초대해준 psycho승우, 감사! ㅋㅋ
Posted by 허늬