您的位置:首页 > 编程语言 > Java开发

c代码调用java代码

2014-01-25 22:10 295 查看
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"));
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: