我正在使用android上的将当前的活动传递给本机方法。但我不会使用类似于JNI的函数名。我正在手动注册本机函数。
这个工作 (JNI命名)。
com_venkatesh_home.c
JNIEXPORT void JNICALL Java_com_venkatesh_Home_doStuff(JNIEnv *env, jobject activity) {
jclass Activity = (*env)->GetObjectClass (env, activity);com.venkatesh.Home.java
private native void doStuff();
static {
System.loadLibrary("venkatesh");
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
doStuff();
}但这不适用于,不适用于。(手动注册和将活动作为对象传递)
me.c
static JavaVM *java_vm;
void do_stuff (jobject activity)
{
JNIEnv *env;
if ((*java_vm)->GetEnv(java_vm, (void **) &env, JNI_VERSION_1_6) != JNI_OK) {
LOG_D("GetEnv failed");
return -1;
}
jclass Activity = (*env)->GetObjectClass (env, activity);
}
jint JNI_OnLoad(JavaVM *vm, void *reserved)
{
java_vm = vm;
JNIEnv* env;
if ((*vm)->GetEnv(vm, (void **) &env, JNI_VERSION_1_6) != JNI_OK) {
LOG_D ("GetEnv failed.");
return -1;
}
// Find the class calling native function
jclass Home = (*env)->FindClass(env, "com/venkatesh/Home");
if (Home == NULL) {
LOG_D ("FindClass failed : No class found.");
return -1;
}
// Register native method for getUsbPermission
JNINativeMethod nm[1] = {
{ "doStuff", "(Landroid/app/Activity;)V", do_stuff}
};
if ((*env)->RegisterNatives(env, NativeUsb, nm , 1)) {
LOG_D ("RegisterNatives Failed.");
return -1;
}
return JNI_VERSION_1_6;
}com.venkatesh.Home.java
private native void doStuff(Activity activity);
static {
System.loadLibrary("venkatesh");
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
doStuff(this);
}错误是
JNI WARNING: 0xb89a7788 is not a valid JNI reference (GetObjectClass)其中0xb89a7788是作为活动在jni端接收的"this“。
现在,据我所知,这代表了当前的对象。相当于巨蟒中的自我。但是,我将把一个对象传递给本机端,因此它应该是一个有效的引用。为什么引用错误无效?这不是什么东西吗?怎么啦?
发布于 2014-06-16 13:18:46
之所以发生这种情况,不是因为方法是如何注册的,而是因为您的本机方法的签名。我会像这样重写这个方法:
void do_stuff (JNIEnv *env, jobject this, jobject activity)
{
jclass Activity = (*env)->GetObjectClass (env, activity);
// ...and whatever else you want...
}每个JNI方法都必须以一个JNIEnv *作为其第一个参数。(还请注意缺少static env变量--它不是必需的)。另外,由于它不是静态方法,所以传入该方法的第一个参数将是this,而不是activity。
https://stackoverflow.com/questions/24239859
复制相似问题