Android之jni深入

小技巧:自动生成 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);
}

完成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494426.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML选择器

HTML选择器1、标签选择器直接将HTML元素中的标签作为选择器&#xff0c;可以是p、h1、d1、strong等HTML标签&#xff0c;在CSS中直接展现。2、ID选择器通常在编写页面的时候设定某些标签元素的ID,同一个HTML中ID不允许重复&#xff0c;例如&#xff0c;<div id"wrapper…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 13丨每位学生的最高成绩【难度中等】

活动介绍&#xff1a; 「数据仓库技术交流群」已经正式启动每日SQL打卡&#xff0c;帮助大家扎实基础&#xff0c;努力工作之余&#xff0c;别忘了自我提升。另有超多CSDN 周边礼物相送。 欢迎报名和邀请小伙伴参与&#xff0c;一个人可能走得很快&#xff0c;但一群人会走得很…

语言处理想突破,三座大山必须过

来源&#xff1a;大数据文摘编译&#xff1a;李佳、汤圆、钱天培“我的飞机什么时候到&#xff1f;”把这个问题抛给智能机器人助手。几乎可以肯定&#xff0c;机器立马就懵逼了。“我”是谁&#xff1f;“飞机”是航班还是淘宝上订的模型玩具呢&#xff1f;“到”又是到哪呢&a…

利用github page搭建博客

为什么选择GitHub Pages&#xff1f; 很多人用 wordpress&#xff0c;你为什么要用 github pages 来搭建&#xff1f; 1、github pages有300M免费空间&#xff0c;资料自己管理&#xff0c;保存可靠&#xff1b; 2、学着用 github&#xff0c;享受 github 的便利&#xff0c…

C语言中printf(built: %s %s,__TIME__,__DATE__);方便调试

代码中加入printf("built: %s %s",__TIME__,__DATE__);这样就可以了;后面将显示最后编译的时间。 这样可以知道自己改的代码是否生效&#xff0c;是否编译进去。转载于:https://www.cnblogs.com/jisheng/archive/2013/01/15/2860706.html

CSDN每日打卡已经2周,进展如何?(送两个CSDN背包)

&#x1f345; 作者主页&#xff1a;不吃西红柿 &#x1f345; 简介&#xff1a;CSDN博客专家 & 总榜前十&#x1f3c6;、HDZ核心组成员。欢迎点赞、收藏、评论 &#x1f345; 粉丝专属福利&#xff1a;知识体系、面试题库、技术互助、简历模板。文末公众号领取 点赞评论 …

WordPress环境配置与安装

要安装wordpress,要安装apache,php,mysql,还要进行一系列复杂的配置&#xff0c;较为复杂。 apache安装 php5.5.6 下载链接&#xff1a;http://windows.php.net/download/#php-5.5 推荐 V11 x64&#xff0c;也就是64bit的 apache2.4&#xff0c;下载链接&#xff1a;http:/…

趋势 | 人工智能领域十大最具成长性技术展望

来源&#xff1a;搜狐日前&#xff0c;在2018世界机器人大会基础技术与创新论坛中&#xff0c;中国电子学会发布了《新一代人工智能十大成长性技术展望》。经调研走访了一批在新一代人工智能技术及产业方面具备领先水平和特色的龙头企业&#xff0c;拜访了来自于知名高校、研究…

CTex + Texmaker

CTex 套装提供了一个Latex编译环境和相关的库&#xff0c;最大的优点是自动部署&#xff0c;直接就可以用。但是CTex自带的WinEdt和开源的Texmaker比起来在设计方面显得比较粗陋&#xff0c;影响工作效率。 Texmaker 本身只是一个前台软件&#xff0c;但是设计精良。如果已经安…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 14丨报告的记录 I【难度简单】

活动介绍&#xff1a; 「数据仓库技术交流群」已经正式启动每日SQL打卡&#xff0c;帮助大家扎实基础&#xff0c;努力工作之余&#xff0c;别忘了自我提升。另有超多CSDN 周边礼物相送。 欢迎报名和邀请小伙伴参与&#xff0c;一个人可能走得很快&#xff0c;但一群人会走得很…

android之phonegap入门

利用phoneGap可以利用HTML开发安卓应用&#xff0c;是web app的一种&#xff0c;可以有效的提高开发效率&#xff0c;降低开发成本 。 第一步&#xff1a; 开发环境配置以及基本操作请参考其它文档. 新增一个名为 phoneGap 的android项目,将主activity命名为:PhoneGapActivi…

java获得项目绝对路径

在jsp和class文件中调用的相对路径不同。 在jsp里&#xff0c;根目录是WebRoot 在class文件中&#xff0c;根目录是WebRoot/WEB-INF/classes 当然你也可以用System.getProperty("user.dir")获取你工程的绝对路径。 1.jsp中取得路径&#xff1a;以工程名为TEST为例&am…

全球第二家 亚马逊“喜提”万亿美金市值 AI或是最大功臣

亚马逊创始人杰夫贝佐斯&#xff08;Jeff Bezos&#xff09;来源&#xff1a;网易智能摘要&#xff1a;9月5日消息&#xff0c;美国当地时间周二&#xff0c;全球电商巨头亚马逊(Amazon)股价一度触及史上最高点&#xff0c;促使亚马逊市值短暂达到1万亿美元。不过&#xff0c;在…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 14丨重新格式化部门表【难度中等】

活动介绍&#xff1a; 「数据仓库技术交流群」已经正式启动每日SQL打卡&#xff0c;帮助大家扎实基础&#xff0c;努力工作之余&#xff0c;别忘了自我提升。另有超多CSDN 周边礼物相送。 欢迎报名和邀请小伙伴参与&#xff0c;一个人可能走得很快&#xff0c;但一群人会走得很…

Android之webView入门

WebView可以使得网页轻松的内嵌到app里&#xff0c;还可以直接跟js相互调用。 webview有两个方法&#xff1a;setWebChromeClient 和 setWebClient setWebClient&#xff1a;主要处理解析&#xff0c;渲染网页等浏览器做的事情 setWebChromeClient&#xff1a;辅助WebView处…

APL开发日志--2013-01-17

以后作者在博客上在专栏记录 APL每天开发日志, 以记录APL最新进展. 2013-01-17 APL开发日志: -------------------------------------------------------------------------------------------------------- 1. 增加API: getAplPublicPath() ; // 获得APL公共路径 setAplPubli…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 15丨查询活跃业务【难度中等】

活动介绍&#xff1a; 「数据仓库技术交流群」已经正式启动每日SQL打卡&#xff0c;帮助大家扎实基础&#xff0c;努力工作之余&#xff0c;别忘了自我提升。另有超多CSDN 周边礼物相送。 欢迎报名和邀请小伙伴参与&#xff0c;一个人可能走得很快&#xff0c;但一群人会走得很…

苹果/三星/华为纷纷布局人工智能 将AI作为公司发展新动力

来源&#xff1a;手机报在线摘要&#xff1a; 目前&#xff0c;以苹果、三星和华为为代表的手机厂商除了继续探索人脸识别、屏下指纹和柔性显示屏等技术外&#xff0c;也将目标瞄向了人工智能&#xff0c;纷纷将“AI拍照”、“AI芯片”等作为营销热门话题&#xff0c;并通过大力…

Android之Activity框架

在安卓应用中&#xff0c;经常需要Activity中经常需要有大量相似的Activity类&#xff0c;这些类往往有相似的结构与功能&#xff0c;因此产生了大量重复代码&#xff0c;为此&#xff0c;以下提供一种方法有效的降低了代码冗余。 定义Activity工具类 * 应用程序Activity…

POJ-1260 Pearls DP

题目链接&#xff1a;http://poj.org/problem?id1260 基本DP&#xff0c;只要证明最优解中不会有交叉替换&#xff0c;得出转移方程&#xff1a;f[i]min{f[j](a[j1]..a[i]10)*p[i]}。由(ai10)*bi(aj10)*bj(aiaj10)*bj > (ai10)*biai*bj 替换> t*biai*bj 可证。 1 …