[ndk,2]ndk开发案例和错误处理(五)

2014-11-23 21:12:37 · 作者: · 浏览: 36

return result;

}

//C调用java中参数为string的方法

public voidprintString(String s){

System.out.println("我是java方法"+s);

}

}

2、c代码的方法:

①、调用java中的helloFromJava()方法

//obj 代表的是调用这个c代码的java对象

JNIEXPORT void JNICALLJava_cn_itcast_ndkcallback_DemoActivity_callMethod2

(JNIEnv * env , jobject obj) {

//获取字节码

jclass jclazz =

(*env)->FindClass(env,"cn/itcast/ndkcallback/DataProvider");

// jmethodID (*GetStaticMethodID)(JNIEnv*, jclass, const char*, const char*);

//如果一个java方法是 静态的 就必须通过 GetStaticMethodID

//获取方法的id

jmethodIDjvoidmethod =

(*env)->GetMethodID(env,jclazz,"helloFromJava","()V");

//必须在这个地方 创建出来 dataprovider的对象

// jobject (*AllocObject)(JNIEnv*, jclass);

//创建java中dataprovider类的对象

jobject dpobj =(*env)->AllocObject(env,jclazz);

//调用方法:

(*env)->CallVoidMethod(env,dpobj,jvoidmethod);

}

②、调用java中Add(int x,int y)方法:

JNIEXPORT void JNICALLJava_cn_itcast_ndkcallback_DemoActivity_callMethod3

(JNIEnv * env , jobject obj) {

jclass jclazz =

(*env)->FindClass(env,"cn/itcast/ndkcallback/DataProvider");

jmethodID jintmethod =(*env)->GetMethodID(env,jclazz,"Add","(II)I");

jobject dpobj =(*env)->AllocObject(env,jclazz);

// jint (*CallIntMethod)(JNIEnv*, jobject, jmethodID, ...);

//调用带有int类型返回值的方法:

intresult =(*env)->CallIntMethod(env,dpobj,jintmethod,3,5);

LOGI("c resutl=%d",result);

}

③、调用java中printString(Strings)方法:

JNIEXPORT void JNICALLJava_cn_itcast_ndkcallback_DemoActivity_callMethod4

(JNIEnv * env , jobject obj) {

jclass jclazz =

(*env)->FindClass(env,"cn/itcast/ndkcallback/DataProvider");

jmethodID jvoidmethod =

(*env)->GetMethodID(env,jclazz,"printString","(Ljava/lang/String;)V");

jobject dpobj =(*env)->AllocObject(env,jclazz);

(*env)->CallVoidMethod(env,dpobj,jvoidmethod,(*env)->NewStringUTF(env,"haha from c"));

}

十三 c代码调用java中的静态方法:

1、在类中定义一个静态方法:

public class DataProvider {

//静态方法

public static void hellofromstatic(){

System.out.println("我是静态方法");

}

}

2、c代码:

//obj 代表的是调用这个c代码的java对象

JNIEXPORT void JNICALLJava_cn_itcast_ndkcallback_DemoActivity_callMethod2

(JNIEnv * env , jobject obj) {

//获取类字节码

jclass jclazz =

(*env)->FindClass(env,"cn/itcast/ndkcallback/DataProvider");

// jmethodID (*GetStaticMethodID)(JNIEnv*, jclass, const char*, const char*);

//如果一个java方法是 静态的 就必须通过 GetStaticMethodID

//获取静态方法id 使用GetStaticMethodID方法

jmethodID jvoidmethod =

(*env)->GetStaticMethodID(env,jclazz,"hellofromstatic","()V");

/// void (*CallStaticVoidMethod)(JNIEnv*,jclass, jmethodID, ...);

//执行静态方法

(*env)->CallStaticVoidMethod(env,jclazz,jvoidmethod);

}