在学习JNI中寻找方法签名时遇见的问题

1.when

在学习安卓JNI时,c调java中的方法时用到方法
env->GetMethodID(jclazz,"add1", "(II)I");
这个方法的原型如下
jmethodID GetMethodID(jclass clazz, const char* name, const char* sig)
具体参数意义可参考文献,这里简单解决一下最后一个参数sig的写法。
sig是java方法签名,这个字符串如何得到呢?请看下面介绍。

2.how

ndk版本低的可以用一下步骤

  1. 在命令窗口中进入应用的classes/debug/目录
  2. 执行命令: javap -s 全类名,显示所有的方法的签名信息

这里我的电脑运行 javap 命令时出现了一个小问题,等下将问题解决方式奉上。(问题一)

ndk版本高的(这里我也不清楚多高是高,我用的版本是r21b 64位的)

  1. 定位到 app/build/intermediates/javac/debug/classes目录下
  2. 在AS中右键Show in Explorer
  3. 在目录中右键选中 Open in Terminal(问题二)
  4. 输入 javap -s 包名.类名 即可(问题三)

3.problem

  1. 上述问题一,是我在运行 javap 命令时系统不识别这个命令,系统给出以下的提示

    ‘javac’ 不是内部或外部命令,也不是可运行的程序 或批处理文件

    我怀疑的在目录下敲出java命令或java -version 却提示成功。javac 、javap命令全部提示不是内部命令。
    解决方法: 其实这是你配置jdk时的遗留问题,在win10下配置path的jdk路径时不可以使用相对路径,必须写为绝对路径。而且配置两个jdk不要在一行上,这个要分开写,各一行,同时结尾不能带分号!最好将两个路径放在最上位,配置完一定要重启cmd测试javac 、javap命令。如下图:

  1. 问题二是我的电脑在文件夹里面点击右键没有在此处打开命令窗口的选项。
    解决方法:
    1.在桌面新建一个txt文件,复制以下代码。
    2.将文件保存修改文件名为XXX.txt 为 OpenCmdHere.reg,保存完毕双击此文件就ok啦。
 Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\Directory\shell\OpenCmdHere]
@="在此处打开命令提示符"
"Icon"="cmd.exe"[HKEY_CLASSES_ROOT\Directory\shell\OpenCmdHere\command]
@="PowerShell -windowstyle hidden -Command \"Start-Process cmd.exe -ArgumentList '/s,/k, pushd,%V' -Verb RunAs\""[HKEY_CLASSES_ROOT\Directory\Background\shell\OpenCmdHere]
@="在此处打开命令窗口"
"Icon"="cmd.exe"[HKEY_CLASSES_ROOT\Directory\Background\shell\OpenCmdHere\command]
@="PowerShell -windowstyle hidden -Command \"Start-Process cmd.exe -ArgumentList '/s,/k, pushd,%V' -Verb RunAs\""[HKEY_CLASSES_ROOT\Drive\shell\OpenCmdHere]
@="在此处打开命令窗口"
"Icon"="cmd.exe"[HKEY_CLASSES_ROOT\Drive\shell\OpenCmdHere\command]
@="PowerShell -windowstyle hidden -Command \"Start-Process cmd.exe -ArgumentList '/s,/k, pushd,%V' -Verb RunAs\""[HKEY_CLASSES_ROOT\LibraryFolder\background\shell\OpenCmdHere]
@="在此处打开命令窗口"
"Icon"="cmd.exe"[HKEY_CLASSES_ROOT\LibraryFolder\background\shell\OpenCmdHere\command]
@="PowerShell -windowstyle hidden -Command \"Start-Process cmd.exe -ArgumentList '/s,/k, pushd,%V' -Verb RunAs\""
  1. 问题三是刚才测试的cmd中javap命令还能执行,通过AS中打开的目录右键进入cmd中执行javap命令就不行了,于是我复制了路径,直接在cd + 复制的目录 。进入后执行的javap -s 居然成功了,在之后用AS打开的目录右键进入cmd中执行javap命令就可以了,希望你们没有这个小问题,要不然重重困难,解决完又深夜了,别指望多学一会儿了。

4.result

在解决完所有的问题后,回归主题,在jni中的jmethodID GetMethodID(jclass clazz, const char* name, const char* sig)方法中的sig是代表着方法签名这个字符串的,而这个字符串的生成方法通过以上步骤就解决了,具体cmd中的显示如下图:

之后就可以找到方法签名啦!

学JNI之方法签名遇到的问题相关推荐

  1. 本地方法(JNI)——编码签名

    [0]README 1) 本文部分文字描述 转自 core java volume 2 , 旨在理解 本地方法(JNI)--编码签名 的基础知识 : [1]编码签名相关 1) 混编规则:为了访问实例域 ...

  2. NDK学习笔记:JNI调用Java层方法创建Native的AudioTrack播放PCM(方法签名,CallXXXMethod)

    NDK学习笔记:JNI调用Java层方法创建Native的AudioTrack播放PCM 题目有点复杂,不过确实就是那么回事.这章想记录的内容比较多,先列出来: native static 与 nat ...

  3. Android系统的JNI原理分析(二)- 数据类型转换和方法签名

    声明 前阶段在项目中使用了Android的JNI技术,在此文中做些技术知识总结. 本文参考了一些书籍的若干章节,比如<Android进阶解密-第9章-JNI原理>.<深入理解Andr ...

  4. javap 获取JNI方法签名

    JNI动态注册时需要方法签名,可以自己手写,但是出错的概率比较高,也可以使用javap命令自动生成.找到要获取签名的Java class文件,比方MainActivity.class,进入包名的上一级 ...

  5. java字段描述符_Java 的方法签名与字段类型表示-[Ljava.lang.String;

    我们什么时候会接触到 Java 的方法签名呢?在进行 JNI 调用时,还有在看方法重载时.重载的方法是有不同的方法签名的,而是不区分返回值,而实际方法签名还揉入了返回值类型的,还有就是 javap - ...

  6. 什么叫方法签名 Java

    方法签名由方法名称和一个参数列表(方法的参数的顺序和类型)组成. 注意,方法签名不包括方法的返回类型.不包括返回值和访问修饰符. 常见的问题应用:重载和重写. public class A{prote ...

  7. java 方法里面定义接口_java – 当接口A在其方法签名中定义接口B时

    -如何限制A的实现在方法签名中使用B的某个实现? 用例 这是一个Unit接口和两个实现它的枚举: public interface Unit { ... } public enum ForceUnit ...

  8. java 签名 apk mac_java 方法签名

    public void test(){}()V public void test1(int i){}              (I)V public int test2(){ return 1;}( ...

  9. Java中方法签名signature、方法重载以及“两同两小一大”的方法覆盖(方法重写)总结

    1. 方法 1.1 方法 实现了某一功能,代码可以复用 1.2 方法签名 java中每个方法都有一个签名,包含方法名和参数列表(类型.个数以及顺序),只要其中一个不同,方法的签名不同,也就是属于不同的 ...

最新文章

  1. libsvm java api文档,libsvm-javaAPI
  2. 浙江将建设超级高速公路,全面支持自动驾驶
  3. background使用
  4. 你应该知道的大数据领域12大动向
  5. 马云:创业成功者没有固定模式
  6. 消息队列一:为什么需要消息队列(MQ)?
  7. Ubuntu获取最高权限(su)的方式
  8. 2011微软校园招聘笔试题
  9. 行走在数据库上的行癫(四)
  10. 什么?你居然不会微信分身
  11. 2014华中首届手游创意大赛
  12. golang 根据生日计算星座和属相
  13. linux 内核调试 booting the kernel.,Uncompressing Linux....... done, booting the kernel就不动了的一个可能原因...
  14. 宝塔Linux面板问题QA汇总
  15. 对残差网络resnet shortcut的解释
  16. MacOS 10.15 Catalina 更新系统后无法访问根目录下的/dashu/log
  17. HDU2080 夹角有多大II
  18. feko 2017安装包
  19. SDUT OJ 2974
  20. Spring5框架(上) IOC

热门文章

  1. 年终回顾||MoPaaS魔泊云2018筑梦历程
  2. 桌面模拟器(TTS)脚本API
  3. 嘉宝影视|中国电影产业内人士对实现“十四五”目标充满信心
  4. Android 百度语音识别(详细步骤+源码)
  5. NLP的数据增强技术总结
  6. 计算机怎么配置组播地址,如何实现端口静态添加组播MAC地址 -电脑资料
  7. 云端还是本地,数据放哪儿更安全之泄密事件篇
  8. X射线晶体定向仪工作原理
  9. linux nginx部署项目配置域名
  10. 【算法入门09】矩形覆盖