logo

English

이곳의 프로그래밍관련 정보와 소스는 마음대로 활용하셔도 좋습니다. 다만 쓰시기 전에 통보 정도는 해주시는 것이 예의 일것 같습니다. 질문이나 오류 수정은 siseong@gmail.com 으로 주세요. 감사합니다.

안드로이드 Native C 코드에서 Intent 보내는 방법

by digipine posted Nov 02, 2017
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print

안드로이드를 개발할 때  Framework나 NDK 상에서 앱으로 Intent를 보내고 싶을 경우가 있습니다.

아시다시피 정식으로는 Intent는 Java 영역에서만 보낼 수 있다고 하는데요.

아래와 같이 시스템 커멘드를 이용해서 C 코드 상에서도 Intent를 보낼 수 있는 방법이 있을 것 같습니다.

아니면 C에서 JNI로 자바를 콜백하는 구조로 만들어도 될 것 같습니다.

아래 소스 코드를 참조하세요.

잘안되시면 아래 커맨드 예제에서 --user 0  옵션을 빼거나 추가해보세요.

 

char cmdbuffer[1024] = {0};

const char *cmd = "am startservice --user 0 -a %s --ei ars_flag 2 --ei invitationType %d --ei mode 1 --es ars_gadget_uuid \"%s\" --ei ars_conn_handle %d --es ars_user_uuid \"%s\" --es ars_username \"%s\"";

sprintf(cmdbuffer, cmd,...);

system(cmdbuffer);

 

 

좀더 전문가스러운 방법도 있네요.

 

class cIntent
{
 jclass m_intentClass;
 jmethodID m_intentConstructorMethodId;
 jmethodID m_intentSetActionMethodId;
 jobject m_contextObj;
 jmethodID m_sendBroadcastMethodId;
 bool m_bIntentEnd;
 jobject createNewIntent(char* intentType,Engine*e_pEngine)
 {
  jstring intentString = e_pEngine->mApp->appThreadEnv->NewStringUTF(intentType);
  jobject intentObject = e_pEngine->mApp->appThreadEnv->NewObject(m_intentClass,m_intentConstructorMethodId);

  //call intent
  e_pEngine->mApp->appThreadEnv->CallVoidMethod(intentObject, m_intentSetActionMethodId, intentString);

  return intentObject;
 }

 //to contenxt
 void sendBroadcast(jobject intentObject,Engine*e_pEngine)
 {

  //LOG_INFO("Broadcasting intent.."); 
  e_pEngine->mApp->appThreadEnv->CallVoidMethod(m_contextObj,m_sendBroadcastMethodId, intentObject);
  //LOG_INFO("Intent broadcasted");
 }

 public:

 cIntent()
 {
  m_intentClass = 0;
  m_intentConstructorMethodId = 0;
  m_intentSetActionMethodId = 0;
  m_contextObj = 0;
  m_sendBroadcastMethodId = 0;
  m_bIntentEnd = true;
 }

 ~cIntent();

 bool Init(Engine*e_pEngine)
 {
  m_bIntentEnd = true;
  jclass activityClass = e_pEngine->mApp->appThreadEnv->GetObjectClass(e_pEngine->mApp->appThreadThis);
  jmethodID appGetContextId = e_pEngine->mApp->appThreadEnv->GetMethodID(activityClass, "getApplicationContext", "()Landroid/content/Context;");

  if(appGetContextId == 0)
   return false;
  m_contextObj = e_pEngine->mApp->appThreadEnv->CallObjectMethod(e_pEngine->mApp->appThreadThis, appGetContextId);

         if(m_contextObj == 0)   
   return false;
         jclass contextClass = e_pEngine->mApp->appThreadEnv->FindClass("android/content/Context");

         if(contextClass == 0)
   return false;

         jmethodID sendBroadcastMethodId = e_pEngine->mApp->appThreadEnv->GetMethodID(contextClass, "sendBroadcast", "(Landroid/content/Intent;)V");

         if(sendBroadcastMethodId == 0)
   return false;

         m_intentClass = e_pEngine->mApp->appThreadEnv->FindClass("android/content/Intent");

         if(m_intentClass == 0)
   return false;

         m_intentConstructorMethodId = e_pEngine->mApp->appThreadEnv->GetMethodID(m_intentClass, "<init>", "()V"); 
         if(m_intentConstructorMethodId == 0)
   return false;

         m_intentSetActionMethodId = e_pEngine->mApp->appThreadEnv->GetMethodID(m_intentClass, "setAction", "(Ljava/lang/String;)Landroid/content/Intent;"); 
         if( m_intentSetActionMethodId == 0)
   return false;

  return true;
 }

 //char* intent = "com.example.TEST"; 
 void IntentGo(char*e_strMessage,Engine*e_pEngine)
 {
  m_bIntentEnd = false;
  char* intent = e_strMessage; 
  jobject l_jobject = createNewIntent(intent,e_pEngine);
  sendBroadcast(l_jobject ,e_pEngine   );
  //e_pEngine->mApp->appThreadEnv->DeleteGlobalRef
  m_bIntentEnd = true;

 }

};

TAG •

List of Articles
No. Subject Author Date Views
22 Android - 블루투스 BLE 개발하기 digipine 2017.11.02 16836
21 Android - 슬립모드 (Sleep Mode) 방지 코드 digipine 2017.10.29 2534
20 안드로이드 파일 입출력시 한글 깨짐 문제 digipine 2017.10.29 1785
19 Android 하드웨어 코덱 포팅하기, OpenCore, OpenMAX digipine 2017.11.03 1741
18 [안드로이드] 가속도 (Accelerometer)센서 Shake 이벤트 예제 digipine 2017.11.02 1727
17 Ubuntu 리눅스 fastboot 설치 lizard2019 2019.12.13 1622
16 Toolchain Error 'No such file or directory' 해결방법 lizard2019 2019.12.19 1474
15 Android - 이미지(비트맵) 리사이징 digipine 2017.11.01 1436
» 안드로이드 Native C 코드에서 Intent 보내는 방법 digipine 2017.11.02 1423
13 Atomic Operation에 대해서 엉뚱도마뱀 2017.12.18 1318
12 안드로이드 시스템 개발시 mmm 커멘드 사용법 digipine 2017.11.01 1302
11 atomic vs volatile vs synchronized file 엉뚱도마뱀 2017.12.18 1278
10 안드로이드 Activity간 인자 전달하기 digipine 2017.10.29 1130
9 Ubuntu 16.0.4 openjdk 7 설치방법 lizard2019 2019.12.19 935
8 [Java] SortedSet과 Comparable을 이용한 정렬(Sort) digipine 2017.10.29 881
7 Android - Browser 에서 Activity 실행하기 file digipine 2017.10.29 832
6 Ubuntu 기본 쉘 dash 대신 bash로 설정 digipine 2017.11.02 780
5 Android 기반 Application Ant 빌드 방법 digipine 2017.10.29 680
4 Android - AlarmManager를 이용해서 서비스 실행 시키는 코드 digipine 2017.10.29 553
3 안드로이드 애플리케이션 구성요소 digipine 2017.10.29 550
Board Pagination Prev 1 2 Next
/ 2