C代码回调java代码

来源:互联网 发布:网络创业 编辑:程序博客网 时间:2024/06/05 20:30

C代码调用已经写好的java代码:

     几种常调用的方法:

1.C调用java空方法。

 2.C调用java中两个带int参数的方法。

 3.C调用java中参数为String的方法。

 4.C调用java中定义的方法接口和java方法不在同一个类中。

 5.C调用java中静态方法。

     其中原理和java中反射是一个道理。

     下面来一起实现以上几种c代码调用java代码的方法:

     1.项目的目录结构如下:


2.DataProvider类:

package com.xiaomai.ndkcallback;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class DataProvider {//C调用java空方法public void helloFromJava(){System.out.println("哈哈哈  我被调用了");}//C调用java中的带两个int参数的方法public int Add(int x,int y){ int result=x+y;System.out.println("result:"+result);return result;}//C调用java中参数为string的方法public void printString(String s){System.out.println(s);}public static void demo(){System.out.println("哈哈哈,我是静态方法");}public native void callMethod1();public native void callMethod2();public native void callMethod3();public native void callMethod4();public native void callMethod5();}

3.使用javap -s 命令 打印方法签名:方法签名用于c代码中(下面会写到)


4 生成.h头文件;(输入命令是记得在bin后面加classes,因为很容易忘了 导致出错 找不到java类文件)


执行命令完成后会在项目jni文件夹中生成com_xiaomai_ndkcallback_DataProvider.h文件(F5刷新既可以看见)

com_xiaomai_ndkcallback_DataProvider.h中就有我们写C代码时要用到的方法名,省着自己写,自己写很容易不小心写错。

5写C代码:

解释上面的方法签名:jmethodID methodId=(*env)->GetMethodID(env,clazz,"helloFromJava","()V");中的()V就是我们上面javap -s 命令打印出来的方法签名里面的。

#include "com_xiaomai_ndkcallback_DataProvider.h"JNIEXPORT void JNICALL Java_com_xiaomai_ndkcallback_DataProvider_callMethod1  (JNIEnv * env, jobject jobject){///jclass      (*FindClass)(JNIEnv*, const char*);jclass clazz=(*env)->FindClass(env,"com/xiaomai/ndkcallback/DataProvider");//  jmethodID   (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);// 方法签名  参数和返回值jmethodID methodId=(*env)->GetMethodID(env,clazz,"helloFromJava","()V");// void        (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);(*env)->CallVoidMethod(env,jobject,methodId);}JNIEXPORT void JNICALL Java_com_xiaomai_ndkcallback_DataProvider_callMethod2  (JNIEnv * env, jobject jobject){jclass clazz=(*env)->FindClass(env,"com/xiaomai/ndkcallback/DataProvider");//  jmethodID   (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);// 方法签名  参数和返回值jmethodID methodId=(*env)->GetMethodID(env,clazz,"Add","(II)I");// int        (*CallStaticIntMethod)(JNIEnv*, jclass, jmethodID, ...);(*env)->CallIntMethod(env,jobject,methodId,3,6);}JNIEXPORT void JNICALL Java_com_xiaomai_ndkcallback_DataProvider_callMethod3  (JNIEnv * env, jobject jobject){jclass clazz=(*env)->FindClass(env,"com/xiaomai/ndkcallback/DataProvider");jmethodID methodId=(*env)->GetMethodID(env,clazz,"printString","(Ljava/lang/String;)V");// jint        (*CallIntMethod)(JNIEnv*, jobject, jmethodID, ...);jstring str=(*env)->NewStringUTF(env,"hellojni");(*env)->CallVoidMethod(env,jobject,methodId,str);}JNIEXPORT void JNICALL Java_com_xiaomai_ndkcallback_DataProvider_callMethod4  (JNIEnv * env, jobject jobj){jclass clazz=(*env)->FindClass(env,"com/xiaomai/ndkcallback/MainActivity");jmethodID methodId=(*env)->GetMethodID(env,clazz,"helloFromJava","()V");//需要创建MainActiviy对象//jobject     (*AllocObject)(JNIEnv*, jclass);jobject obj=(*env)->AllocObject(env,clazz);(*env)->CallVoidMethod(env,obj,methodId);}JNIEXPORT void JNICALL Java_com_xiaomai_ndkcallback_DataProvider_callMethod5  (JNIEnv * env, jobject jobj){jclass clazz=(*env)->FindClass(env,"com/xiaomai/ndkcallback/DataProvider");//jmethodID   (*GetStaticMethodID)(JNIEnv*, jclass, const char*, const char*);jmethodID methodId=(*env)->GetStaticMethodID(env,clazz,"demo","()V");//jobject     (*CallStaticObjectMethod)(JNIEnv*, jclass, jmethodID, ...);(*env)->CallStaticVoidMethod(env,clazz,methodId);}

6.写android.mk文件

LOCAL_PATH := $(call my-dir)   include $(CLEAR_VARS)   #对应的打包成函数库的名字   LOCAL_MODULE    := hello   #对应的c代码的文件   LOCAL_SRC_FILES := hello.c   include $(BUILD_SHARED_LIBRARY)

7.交叉编译 ndk-build命令;


7.写MianActivity中的代码

package com.xiaomai.ndkcallback;import android.app.Activity;import android.os.Bundle;import android.view.View;public class MainActivity extends Activity {    public DataProvider dp;    static{    System.loadLibrary("hello");    }        public void helloFromJava(){System.out.println("哈哈哈  我在MainActivity被调用了");}        @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        dp=new DataProvider();            }        public void click1(View view){    dp.callMethod1();    }        public void click2(View view){    dp.callMethod2();    }        public void click3(View view){    dp.callMethod3();    }        public void click4(View view){    dp.callMethod4();    }        public void click5(View view){    dp.callMethod5();    }}

8.运行android application  点击相应的按钮就能在控制台看到对应的输出


执行命令完成后会在项目jni文件夹中生成com_xiaomai_ndkcallback_DataProvider.h文件(F5刷新既可以看见)
0 0
原创粉丝点击