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
- c代码回调java中的代码
- C代码回调java代码
- C代码回调java方法
- c代码调用java代码
- C调用java代码
- C调用java代码
- java 调用C代码
- JNI c代码回调java空方法
- Android NDK开发(五)——C代码回调Java代码
- Android 中 c 代码回调Java代码的详细步骤(jni、NDK的使用)
- Android NDK开发——C代码回调Java代码callback
- Java代码转C代码经验
- Java代码转C代码经验
- Java代码中调用C/C++代码
- Java 删除c/c++/java代码注释的代码片段
- 串口Java/c++/C#代码
- java代码转 objective-c
- java调用c/c++代码
- mySQL数据库Sql语句执行效率检查--Explain命令
- 虚函数与纯虚函数
- 类和接口
- 消灭Bug!18款最佳的问题跟踪管理应用程序
- 版本控制SVN与Eclipse4.4.1集成
- C代码回调java代码
- Ubuntu中 JDK的安装和卸载
- 当程序员老去
- 通过NPOI导入Execl返回DataTable
- Android--eclipse 配置ADT插件
- 安卓-Viewpage详解(1)——广告条
- Nodes 的基本问题(UltraTree、TreeView)
- 解决SpringMVC的@ResponseBody返回中文乱码
- spring @component