C++ 调用java方法
今天,我用Android SDK创建了我的第一个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)
我发现了一些示例,但与函数头不一致 我总是
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>和jclass
。即使在C中也没关系,它可以提示开发者,甚至可以节省你的时间,如果你决定切换到C++。阅读有关JNI类型的更多信息。调用[type]方法仅适用于私有方法和构造函数。()当您调用公共方法时,您将得到一个