今天,我用Android在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();
}
}
谢谢你的建议。
发布于 2011-06-16 10:47:22
CalltypeMethod只适用于私有方法和构造函数。(调用实例方法)当您调用公共方法时,您将得到一个AbstractMethodError。
发布于 2011-06-15 23:52:52
jobject
可以是任何java对象,而jclass
应该是表示java.lang.Class
的对象。在C++中,jobject
和jclass
是同一回事,而C++ API试图执行类型安全,并将这些类型声明为jclass
继承jobject
的不同类型。第二个参数应该表示一个类,因此首选jclass
。即使在C语言中它并不重要,如果您决定切换到C++,它也可以提示开发人员,甚至可以节省您的时间。阅读有关JNI类型这里的更多信息。
https://stackoverflow.com/questions/6365703
复制相似问题