c – 调用java方法

我今天用 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文档(Calling Instance Methods).
但我不知道第一个参数(对象)应该是什么.

我试图给出我从调用本机方法获得的类实例,该实例方法因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 *,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();
      }
  }

感谢您的任何建议.

解决方法

调用[type]方法仅适用于私有方法和构造函数. ( Calling Instance Methods)当你拨打公共方法时,你会得到一个 AbstractMethodError.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...