学JNI之方法签名遇到的问题

在学习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中的显示如下图:
在这里插入图片描述
之后就可以找到方法签名啦!

猜你喜欢

转载自blog.csdn.net/qq_41589763/article/details/109634059
今日推荐