Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 调用java方法_C++_Java Native Interface_Android Ndk - Fatal编程技术网

C++ 调用java方法

C++ 调用java方法,c++,java-native-interface,android-ndk,C++,Java Native Interface,Android Ndk,今天,我用Android SDK创建了我的第一个Java本机调用。 我发现了一些示例,但与函数头不一致 我总是 JNIEXPORT void JNICALL Java_com_test_Calculator_calcFileSha1 (JNIEnv *, jclass, jstring); 但我看到了 JNIEXPORT void JNICALL Java_com_test_Calculator_calcFileSha1 (JNIEnv *, jobject, jstring)

今天,我用Android SDK创建了我的第一个Java本机调用。
我发现了一些示例,但与函数头不一致

我总是

JNIEXPORT void JNICALL Java_com_test_Calculator_calcFileSha1 
   (JNIEnv *, jclass, jstring);
但我看到了

JNIEXPORT void JNICALL Java_com_test_Calculator_calcFileSha1 
   (JNIEnv *, jobject, jstring);
属于不同类的头是为了得到调用方的类。
但首选的方式是什么

<>从C++代码中,我想调用java方法。我找到了JNI文档()。
但是我不知道第一个参数(对象)应该是什么

我试图给出从本机方法调用中获得的类实例,但由于AbstractMethodError而失败

固定源代码:

public class TestCalc extends Activity {
   static {
      System.loadLibrary("Test");
   }

   private void setFilesize(long size) {

   }
}
本机库:

// header
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT void JNICALL Java_com_test_TestCalc_calcFilesize
  (JNIEnv *, jobject, jstring);

  void setFilesize(const INT_64 size);

#ifdef __cplusplus
}
#endif

#endif

// code
JNIEnv * callEnv;
jobject callObj;


JNIEXPORT void JNICALL Java_com_test_SHA1Calc_calcFileSha1
  (JNIEnv * env, jobject jobj, jstring file)
{
    callEnv = env;
    callObj = jobj;

    [...]
}

  void setFilesize(const INT_64 size) {
      jmethodID mid;
      jclass cls;

      cls=callEnv->FindClass("com/test/TestCalc");    
      mid=callEnv->GetMethodID(cls, "setFilesize", "(J)V");
      if (mid == 0) {
        __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "NDK:LC: [%s]", "Cannot find method setFilesize");
        return;
      }

      callEnv->ExceptionClear();
      callEnv->CallVoidMethod(callObj, mid, size);
      if(callEnv->ExceptionOccurred()) {
        callEnv->ExceptionDescribe();
        callEnv->ExceptionClear();
      }
  }

感谢您的建议。

jobject
可以是任何java对象,而
jclass
应该是表示
java.lang.Class
的对象。在C API中,<代码> Jojs< /COD>和 JCys是相同的,而C++ API试图强制类型安全,并声明那些类型不同,其中代码> jCys< /Cord>继承了代码> Joojs< /Cord>。第二个参数应该表示一个类,因此首选
jclass
。即使在C中也没关系,它可以提示开发者,甚至可以节省你的时间,如果你决定切换到C++。阅读有关JNI类型的更多信息。

调用[type]方法仅适用于私有方法和构造函数。()当您调用公共方法时,您将得到一个