首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >调用java方法

调用java方法
EN

Stack Overflow用户
提问于 2011-06-15 23:42:43
回答 2查看 1.5K关注 0票数 4

今天,我用Android在Java中创建了我的第一个本机调用。

我找到了一些例子,但与函数头不一致。

我总是用

代码语言:javascript
运行
复制
JNIEXPORT void JNICALL Java_com_test_Calculator_calcFileSha1 
   (JNIEnv *, jclass, jstring);

但我已经看到

代码语言:javascript
运行
复制
JNIEXPORT void JNICALL Java_com_test_Calculator_calcFileSha1 
   (JNIEnv *, jobject, jstring);

属于头部的是不同的被调用者的类。

但是,首选的方法是什么呢?

从C++代码中,我想调用一个java方法。我找到了JNI文档(调用实例方法)。

但我不知道第一个参数(对象)应该是什么。

我尝试给出从本机方法调用中获得的类实例,该方法在AbstractMethodError中失败。

固定源代码:

代码语言:javascript
运行
复制
public class TestCalc extends Activity {
   static {
      System.loadLibrary("Test");
   }

   private void setFilesize(long size) {

   }
}

本地图书馆:

代码语言:javascript
运行
复制
// 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();
      }
  }

谢谢你的建议。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-16 10:47:22

CalltypeMethod只适用于私有方法和构造函数。(调用实例方法)当您调用公共方法时,您将得到一个AbstractMethodError

票数 2
EN

Stack Overflow用户

发布于 2011-06-15 23:52:52

jobject可以是任何java对象,而jclass应该是表示java.lang.Class的对象。在C++中,jobjectjclass是同一回事,而C++ API试图执行类型安全,并将这些类型声明为jclass继承jobject的不同类型。第二个参数应该表示一个类,因此首选jclass。即使在C语言中它并不重要,如果您决定切换到C++,它也可以提示开发人员,甚至可以节省您的时间。阅读有关JNI类型这里的更多信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6365703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档