简体   繁体   English

从jni向Java传递参数

[英]passing parameter from jni to java

How to passing parameter in jni to java.in my case i want to passing getUniqueTargetId to java (android). 如何将jni中的参数传递给java。在我的情况下,我想将getUniqueTargetId传递给java(android)。 Thank you for your help :) ` class CloudImageTarget_UpdateCallback : public QCAR::UpdateCallback { virtual void QCAR_onUpdate(QCAR::State& state) { 谢谢您的帮助:)`类CloudImageTarget_UpdateCallback:公共QCAR :: UpdateCallback {虚拟void QCAR_onUpdate(QCAR :: State&state){

        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.");
                }
            }
        }
    }

}; }; ` `

You can call and pass parameter from JNI to Java using reflection. 您可以使用反射将参数从JNI调用并传递给Java。

Create a method in your Java class 在Java类中创建一个方法

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

In your JNI get the class dynamically 在您的JNI中动态获取类

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

get the method 得到方法

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

here my code so far: //inside virtual void QCAR_onUpdate(QCAR::State& state) void i put this code: 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); 到目前为止,这里是我的代码://内部虚拟void QCAR_onUpdate(QCAR :: State&state)void我输入了以下代码: 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); 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); result of log: Target_Name:null.. thank you for your help Dayanand, and please correct me.thanks a lot :) 日志结果:Target_Name:null ..谢谢您对Dayanand的帮助,请纠正我。非常感谢:)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM