java代码
public class DemoActivity extends Activity {
static{
System.loadLibrary("Hello");
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public native void callMethod1();
public native void callMethod2();
public native void callMethod3();
public native void callMethod4();
public void showToast(View view){
//1.调用底层的c代码
//2.c代码里面 让c语言的代码 调用java代码 显示出来一个土司
callMethod1();
}
public void javaShowToast(String message){
Toast.makeText(this, message, 0).show();
}
public void callvoid(View view){
callMethod2();
}
public void calltwoInt(View view){
callMethod3();
}
public void callString(View view){
callMethod4();
}
}
DataProvider类
public class DataProvider {
//C调用java空方法
public void helloFromJava(){
System.out.println("我是java的空方法");
}
//C调用java中的带两个int参数的方法
public int Add(int x,int y){
int result = x+y;
System.out.println("相加的结果为"+result);
return result;
}
//C调用java中参数为string的方法
public void printString(String s){
System.out.println("我是java方法"+s);
}
public static void hellofromstatic(){
System.out.println("我是静态方法");
}
}
使用javah工具生成头文件(.h)
c代码
#include <stdio.h>
#include "cn_itcast_ndkcallback_DemoActivity.h"
#include <android/log.h>
#define LOG_TAG "System.out"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
//参数env 是JNIEnv的指针
// obj 代表的是调用这个c代码的java对象
JNIEXPORT void JNICALL Java_cn_itcast_ndkcallback_DemoActivity_callMethod1
(JNIEnv * env , jobject obj) {
// 找到 java中的代码javaShowToast 调用他 让java代码显示出来一个土司
//
// Method method = DemoActivity.class.getMethod("javaShowToast", new Class[]{String.class});
// method.invoke(obj, "string");
// 1. 寻找要调用的java代码 的字节码 class
//jclass (*FindClass)(JNIEnv*, const char*);
jclass jclazz = (*env)->FindClass(env,"cn/itcast/ndkcallback/DemoActivity");
// 2.寻找当前 jclass里面的方法的id
// jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
jmethodID jshowtoastmethod = (*env)->GetMethodID(env,jclazz,"javaShowToast","(Ljava/lang/String;)V");
//3. 调用该方法
// void (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
(*env)->CallVoidMethod(env,obj,jshowtoastmethod,(*env)->NewStringUTF(env,"hello from c"));
}
//obj 代表的是调用这个c代码的java对象
JNIEXPORT void JNICALL Java_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
// jmethodID jvoidmethod = (*env)->GetMethodID(env,jclazz,"hellofromstatic","()V");
jmethodID jvoidmethod = (*env)->GetStaticMethodID(env,jclazz,"hellofromstatic","()V");
//必须在这个地方 创建出来 dataprovider的对象
// jobject (*AllocObject)(JNIEnv*, jclass);
// jobject dpobj = (*env)->AllocObject(env,jclazz);
// (*env)->CallVoidMethod(env,dpobj,jvoidmethod);
/// void (*CallStaticVoidMethod)(JNIEnv*, jclass, jmethodID, ...);
(*env)->CallStaticVoidMethod(env,jclazz,jvoidmethod);
}
JNIEXPORT void JNICALL Java_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 result =(*env)->CallIntMethod(env,dpobj,jintmethod,3,5);
LOGI("c resutl=%d",result);
}
JNIEXPORT void JNICALL Java_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"));