c代码调用java代码

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"));

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值