2014-11-28 3 views
0

jni에서 매개 변수를 전달하는 방법 내 경우 getUniqueTargetId를 java (android)에 전달하고 싶다. 당신의 도움 :) `클래스 CloudImageTarget_UpdateCallback 주셔서 감사합니다 : 공공 QCAR :: UpdateCallback {가상 무효 QCAR_onUpdate (QCAR :: 국가 & 상태) {jni에서 자바로 매개 변수를 전달하는 방법

 QCAR::TrackerManager& trackerManager = QCAR::TrackerManager::getInstance(); 

     QCAR::ImageTracker* imageTracker = static_cast<QCAR::ImageTracker*>(
       trackerManager.getTracker(QCAR::ImageTracker::getClassType())); 

     QCAR::TargetFinder* finder = imageTracker->getTargetFinder(); 

     const int statusCode = finder->updateSearchResults(); 

     if (statusCode < 0) 
     { 
      showErrorMessage(statusCode, state.getFrame().getTimeStamp()); 
     } 
     else if (statusCode == QCAR::TargetFinder::UPDATE_RESULTS_AVAILABLE) 
     { 
      // Process new search results 
      if (finder->getResultCount() > 0) 
      { 
       const QCAR::TargetSearchResult* result = finder->getResult(0); 

       if (result->getTrackingRating() > 0) 
       { 

        QCAR::Trackable* newTrackable = finder->enableTracking(*result); 
        if (newTrackable != 0) 
        { 
         LOG("Successfully created new trackable '%s' with rating '%d'.", 
           newTrackable->getName(), result->getTrackingRating()); 


         LOG("Comparing Strings. currentTargetId: %s lastTargetId: %s", 
           result->getUniqueTargetId(), lastTargetId); 

         if (strcmp(result->getUniqueTargetId(), lastTargetId) != 0) 
         { 

          renderState = RS_LOADING; 

          snprintf(targetMetadata, CONTENT_MAX, "%s",result->getMetaData()); 


         } 
         else 
          renderState = RS_NORMAL; 

         pthread_mutex_lock(&framesToSkipMutex); 
         framesToSkipBeforeRenderingTransition = 10; 
         pthread_mutex_unlock(&framesToSkipMutex); 
         // Initialize state variables 
         trackingStarted = false; 
         // Updates the value of the current Target Id with the new target found 
         pthread_mutex_lock(&lastTargetIdMutex); 
         strcpy(lastTargetId, result->getUniqueTargetId()); 
         pthread_mutex_unlock(&lastTargetIdMutex); 
         enterContentMode(); 
        } 
        else 
         LOG("Failed to create new trackable."); 
       } 
      } 
     } 
    } 

}; `

답변

0

리플렉션을 사용하여 JNI에서 Java로 매개 변수를 호출하고 전달할 수 있습니다.

동적

jclass clazz = (*env)->FindClass(env, "complete_package_name/class_name"); 

얻을 당신의 JNI에서 자바 클래스의 메소드를 클래스를

void setUniqueTargetID(int targetID) { 
    this.targetID = targetID; 
} 

을하는 방법을 얻을 만들기

여기
jmethodID setUniqID= (*env)->GetMethodID(env, clazz, "setUniqueTargetID", "(I)"); 
(*env)->CallObjectMethod(env, obj, setUniqID, ID); 
+0

내가 자바 측에서 그것을 얻을하지 않습니다하시기 바랍니다 .. void setUniqueTargetID (int targetID), 그 void ...에서 내 uniqueTargetID를 얻지 못했습니다. 매우 혼란 스럽습니다. – Angie

+0

setUniqID 변수 (* env) -> CallObjectMethod (env)의 getUniqueTargetId 메소드를 get , obj, setUniqID, ID); 나는 당신이 int를 지나가고 있다고 가정하고있다. –

0

내 코드 지금까지 : // 내부 가상 무효 QCAR_onUpdate (QCAR :: 상태 & 상태) 로그의 jclass cls = env->FindClass("com/qualcomm/QCARSamples/CloudImageTarget/CloudImageTarget"); jmethodID mid = env->GetMethodID(cls,"getUniqeTargetID", "([Ljava/lang/String;)V"); env->CallObjectMethod(jObj, mid,newTrackable->getName()); in java i create method String Msg; public void getUniqeTargetID(String msg) { this.Msg = msg; } \\in initApplicationAR i call the method: Log.d(TAG,"Target_Name: "+ Msg); 결과 : TARGET_NAME :이 코드를 넣어 무효가 널 .. 당신의 도움이 Dayanand 주셔서 감사합니다, 그리고 올바른 와요 고마워요 많이 :)