JNI小结

来源:互联网 发布:sql怎么导入数据 编辑:程序博客网 时间:2024/06/08 00:29

最近在研究JNI,以前也用过,但是都是非常的简单,只是仅仅的讲数据传下来,用C处理,然后将处理完的数据返回给JAVA层,还没有使用过C来调用JAVA的函数。

比如我要在JNI实现以下这两个简单的功能:

        textView = (TextView)findViewById(R.id.test_String);textView.setText("");textView2 = (TextView)findViewById(R.id.test_String_2);textView2.setText("");
第一个我想通过JNI的 HelloLoad()函数返回一个字符串变量,然后设置为显示文本,第二个则通过C调用JAVA中的函数,来实现这一功能。

第一个就不多说了,很简单,主要是第二个,需要注意的是findViewById实际上是this.findViewById,也就是说,调用findViewById的对象是传入的obj,而不是myClass = (*env)->FindClass(env,"android/app/Activity");另外,setText参数类型是java/lang/CharSequence,而不是String,虽然String确实可以代替它作为参数。。。。

JNIEXPORT void JNICALL native_setText(JNIEnv *env, jobject obj){jclass myClass = NULL;jmethodID myMethod = 0;jobject testView_2 = NULL;int id = 2131230721;jstring myString = NULL;LOG_Date("0");char mybyte[50] = "I am used in jni,and come from jni,too";myClass = (*env)->FindClass(env,"android/app/Activity");myMethod = (*env)->GetMethodID(env,myClass,"findViewById","(I)Landroid/view/View;");testView_2 = (*env)->CallObjectMethod(env,obj,myMethod,id);myClass = (*env)->FindClass(env,"android/widget/TextView");myString = (*env)->NewStringUTF(env,mybyte);myMethod = (*env)->GetMethodID(env,myClass,"setText","(Ljava/lang/CharSequence;)V");(*env)->CallVoidMethod(env,testView_2,myMethod,myString);}


0 0