小技巧:自动生成 java本地方法对应的c代码的方法名 javah 指令 +全类名

java1.6版本 class C:\workspace\HelloWorldFromC2\bin\classes
java1.7以上 src C:\workspace\HelloWorldFromC2\src

获得方法的签名的方法

javap -s 打印方法的签名 注意要cd到 C:\workspace\HelloWorldFromC2\bin\classes 传全类名

Android.mk文件的书写

Anroid.mk 文件 LOCAL_PATH := $(call my-dir)   // 返回当前c代码目录include $(CLEAR_VARS)        // 清楚了所有 已local 开头的配置文件 唯独不清楚LOCAL_PATHLOCAL_MODULE    := hello   // 库函数的名字  严格遵守makefile 格式  lib  .so  如果前面加lib 不会自动生成了LOCAL_SRC_FILES := Hello.cinclude $(BUILD_SHARED_LIBRARY)  // 加入库函数

java调用C方法,并且传递参数

/*** 计算x和y的加法  apktools  * 315 * @param x* @param y* @return*/public native int add(int x ,int y);  // char   String   short   kiss  keep it simple and stupid  String[]  "123:234" /*** 给字符串后面拼装字符  加密运算   web   url  * @param s* @return*/public native String sayHelloInC(String s);//  /*** 给c代码传递int数组   让c代码给这个数组进行操作* 图形 声音的处理* @param iNum* @return*/public native int[] intMethod(int[] iNum); 

C代码输出到控制台上LOG

#define LOG_TAG "clog"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)

传递两个int实现

JNIEXPORT jint JNICALL Java_com_example_ndkpassdata_DataProvider_add(JNIEnv * env, jobject jobject, jint x, jint y){// 想在logcat控制台上 打印日志LOGD("x=%d",x);LOGI("y=%d",y);// log.i(TAG,"sss");return x+y;}

字符串拼接实现

JNIEXPORT jstring JNICALL Java_com_example_ndkpassdata_DataProvider_sayHelloInC(JNIEnv * env, jobject jobject, jstring str){char* c="hello";// 在C语言中不能直接操作java中的字符串// 把java中的字符串转换成c语言中 char数组char* cstr=Jstring2CStr(env,str);strcat(cstr,c);LOGD("%s",cstr);return  (*env)->NewStringUTF(env,cstr);
}

传递数组实现

JNIEXPORT jintArray JNICALL Java_com_example_ndkpassdata_DataProvider_intMethod(JNIEnv * env, jobject jobject, jintArray jarray){// jArray  遍历数组   jint*       (*GetIntArrayElements)(JNIEnv*, jintArray, jboolean*);// 数组的长度    jsize       (*GetArrayLength)(JNIEnv*, jarray);// 对数组中每个元素 +5int length=(*env)->GetArrayLength(env,jarray);int* array=(*env)->GetIntArrayElements(env,jarray,0);int i=0;for(;i<length;i++){*(array+i)+=5;}return jarray;
}

C语言利用反射回调java方法

java的反射

Class<?> forName = Class.forName("com.example.ndkcallback.DataProvider");Method declaredMethod = forName.getDeclaredMethod("helloFromJava", new Class[]{});declaredMethod.invoke(forName.newInstance(), new Object[]{});

java中的方法的声明

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();
}

实现

实现调用java空方法

JNIEXPORT void JNICALL Java_com_example_ndkcallback_DataProvider_callMethod1(JNIEnv * env, jobject jobject){/**Class<?> forName = Class.forName("com.example.ndkcallback.DataProvider");Method declaredMethod = forName.getDeclaredMethod("helloFromJava", new Class[]{});declaredMethod.invoke(forName.newInstance(), new Object[]{});***////jclass      (*FindClass)(JNIEnv*, const char*);jclass clazz=(*env)->FindClass(env,"com/example/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);
}

实现调用int参数的方法

JNIEXPORT void JNICALL Java_com_example_ndkcallback_DataProvider_callMethod2(JNIEnv *  env, jobject jobject){jclass clazz=(*env)->FindClass(env,"com/example/ndkcallback/DataProvider");jmethodID methodId=(*env)->GetMethodID(env,clazz,"Add","(II)I");// jint        (*CallIntMethod)(JNIEnv*, jobject, jmethodID, ...);(*env)->CallIntMethod(env,jobject,methodId,3,5);
}

实现调用String参数的方法

JNIEXPORT void JNICALL Java_com_example_ndkcallback_DataProvider_callMethod3(JNIEnv * env, jobject jobject){   // 参数 object  就是native方法所在的类jclass clazz=(*env)->FindClass(env,"com/example/ndkcallback/DataProvider");jmethodID methodId=(*env)->GetMethodID(env,clazz,"printString","(Ljava/lang/String;)V");// jint        (*CallIntMethod)(JNIEnv*, jobject, jmethodID, ...);jstring str=(*env)->NewStringUTF(env,"hello");(*env)->CallVoidMethod(env,jobject,methodId,str);}

实现调用其他类中的方法,注意此时的object为该类的对象

JNIEXPORT void JNICALL Java_com_example_ndkcallback_DataProvider_callMethod4(JNIEnv * env, jobject j){jclass clazz=(*env)->FindClass(env,"com/example/ndkcallback/MainActivity");//  jmethodID   (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);// 方法签名  参数和返回值jmethodID methodId=(*env)->GetMethodID(env,clazz,"helloFromJava","()V");// void        (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);// 需要创建DataProvider的 对象// jobject     (*AllocObject)(JNIEnv*, jclass);jobject obj=(*env)->AllocObject(env,clazz);  // new MainActivity();(*env)->CallVoidMethod(env,obj,methodId);}

实现调用静态方法

JNIEXPORT void JNICALL Java_com_example_ndkcallback_DataProvider_callMethod5(JNIEnv * env, jobject j){jclass clazz=(*env)->FindClass(env,"com/example/ndkcallback/DataProvider");//     jmethodID   (*GetStaticMethodID)(JNIEnv*, jclass, const char*, const char*);jmethodID  methodid=(*env)->GetStaticMethodID(env,clazz,"demo","()V");//void        (*CallStaticVoidMethod)(JNIEnv*, jclass, jmethodID, ...);(*env)->CallStaticVoidMethod(env,clazz,methodid);
}

完成

Android之jni深入相关推荐

  1. Android中JNI的使用方法

    Android中JNI的使用方法 首先看一下Android平台的框架图: 可以看到Android上层的Application和ApplicationFramework都是使用Java编写, 底层包括系 ...

  2. Android系统JNI的实现方式

     Android系统JNI的实现方式 All rights reserved JNI(Java Native Interface)定义了一种Java代码调用C或者C++代码等其它代码的方式. 在A ...

  3. Android之jni调用java函数总结

    1.先看之前jni的如何实现动态注册 先看我之间的例子 http://blog.csdn.net/u011068702/article/details/71375920 Android之JNI动态注册 ...

  4. Android之jni日志如何输出

    1.写日志输出帮助文件 先看我之间的例子 http://blog.csdn.net/u011068702/article/details/71375920 Android之JNI动态注册native方 ...

  5. Android之JNI的使用

    转载:http://blog.csdn.net/zeng622peng/article/details/6675666 首先说明,Android系统不允许一个纯粹使用C/C++的程序出现,它要求必须是 ...

  6. Android studio JNI jni实例

    1.Jni的作用 1.Jni的作用 Java是一种比较高级的语言,Java调用c库,调用c++库是必不可少的,所以Jni就应运而生了.看了这个文章的同学,应该能够自己写个APK装在自己的手机里面吧,以 ...

  7. android jni java调用c,Android与JNI(一) ---- Java调用C 静态调用

    第一.通过eclipse新建一个工程名为HelloJni的android工程,并编译. 第二.右键工程-->Android Tools --> Add Native Support,出现如 ...

  8. (转)Android中JNI编程的那些事儿

    Android中JNI编程的那些事儿 首先说明,Android系统不允许一个纯粹使用C/C++的程序出现,它要求必须是通过Java代码嵌入Native C/C++--即通过JNI的方式来使用本地(Na ...

  9. (原)android的JNI中使用C++的类

    android的JNI代码中可以调用C++的类,但是不能直接调用,要加上一个类似于接口的java类,这个类内部调用C++的类.实际上和接口类直接调用C++中的函数差不多,只是稍微复杂了一点. 1. 写 ...

  10. android开发JNI之高级篇

    android开发JNI之高级篇 一,JNI介绍 百度百科 : http://baike.baidu.com/view/1272329.htm 二,JNI开发教程 1,JNI注册方式有两种,一种是静态 ...

最新文章

  1. Gartner 2019基础设施和运维十大趋势:Serverless、边缘计算、SaaS 变复杂等
  2. Android的历史与花边
  3. 【分享】在线解析微信h5网页标签跳转到手机默认浏览器的实现方式
  4. 分布式开放消息系统(RocketMQ)的原理与实践
  5. php flash chart,openflashchart 2.0 简单案例php版
  6. Visual Studio 2017的第五个更新包扩展了调试工具
  7. 链接学习之obj文件探索
  8. Django创建图书管理项目(完整版
  9. 漫步数理统计二十八——混合分布
  10. cocos2d里面如何实现MVC(一)
  11. 指针运算符 * 说明
  12. 【Clickhouse】Clickhouse 外部存储引擎之 File
  13. Docker Engine在CentOS上的安装
  14. python generator与coroutine
  15. 学习 (2012.01)
  16. 如何在线修改图片大小?图片在线改大小方法推荐给你
  17. 南邮研究生matlab与仿真课件,南京邮电大学研究生院.doc
  18. 2022年10大让人惊艳的数据可视化工具,BAT和字节都在用
  19. Smart3D系列教程1之《浅谈无人机倾斜摄影建模的原理与方法》
  20. 求不定积分的几种方法

热门文章

  1. 实践中学到的最重要的机器学习经验!
  2. 不要再纠结卷积的公式啦!0公式深度解析全连接前馈网络与卷积神经网络
  3. 论文浅尝 | Understanding Black-box Predictions via Influence Func
  4. 【JavaWeb】HTML+CSS
  5. Java面试知识点:Object类、Math类、BigDecimal类、自动装箱、拆箱
  6. Event Recommendation Engine Challenge分步解析第五步
  7. 第七章:集成学习(利用AdaBoost元算法...)
  8. Android junit单元测试
  9. jquery获取select中的option的text值
  10. tomcat server.xml配置详解