javah命令 无法确定surface的签名

简介: 笔记

使用AndroidStudio进行JNI开发时,编写好了Native方法的java文件,使用javah生成头文件报错:


2.png

image.png

先上解决方案


修改javah的-classpath参数

我原来的是:

-classpath . -jni -encoding UTF-8 -d $ModuleFileDir$/src/main/cpp/include $FileClass$

修改为:

-classpath D:\Android\Sdk\platforms\android-28\android.jar;. -jni -encoding UTF-8 -d $ModuleFileDir$/src/main/cpp/include $FileClass$

一定要注意D:\Android\Sdk\platforms\android-28\android.jar;.分号后面带一个英文句号。

另外,类似的问题该方法通用

其实还有一种解决方案(不推荐):

就是修改Java代码,把Surface类型改为Object类型,只不过要自己做一些类型转换的工作,增加了代码工作量。


原因分析


我们应该知道,javah生成头文件需要给方法生成签名,而签名的原理是依据类的完整包名来的,所以究其原因是javah的-classpath参数配置错误,导致找不到Surface类。

我们先来看一下javah的用法:

C:\Users\bian>javah
用法:
  javah [options] <classes>
其中, [options] 包括:
  -o <file>                输出文件 (只能使用 -d 或 -o 之一)
  -d <dir>                 输出目录
  -v  -verbose             启用详细输出
  -h  --help  -?           输出此消息
  -version                 输出版本信息
  -jni                     生成 JNI 样式的标头文件 (默认值)
  -force                   始终写入输出文件
  -classpath <path>        从中加载类的路径
  -cp <path>               从中加载类的路径
  -bootclasspath <path>    从中加载引导类的路径
<classes> 是使用其全限定名称指定的
(例如, java.lang.Object)。

-d-o

这两个参数用于设置生成的C\C++头文件的指定,该两参数选项不能同时使用,-d是为中的每个有JNI方法的java类都生成一个头文件,并存放在-d指定的目录中,-o则是生成的所有JNI方法的头文件都放在-o指定的文件中。

-jni

表示用于生成JNI风格的C\C++头文件,默认该参数就是开启的。

-classpath

使用-classpath后JDK将不再使用CLASSPATH中的类搜索路径,如果-classpath和CLASSPATH都没有设置,则JDK使用当前路径(.)作为类搜索路径。

推荐使用-classpath来定义JDK要搜索的类路径,而不要使用环境变量CLASSPATH的搜索路径,以减少多个项目同时使用CLASSPATH时存在的潜在冲突。例如应用1要使用a1.0.jar中的类G,应用2要使用 a2.0.jar中的类G,a2.0.jar是a1.0.jar的升级包,当a1.0.jar,a2.0.jar都在CLASSPATH中,JDK搜索到第一个包中的类G时就停止搜索,如果应用1应用2的虚拟机都从CLASSPATH中搜索,就会有一个应用得不到正确版本的类G。

-verbose

该参数,将显示javah命令搜索和装置类文件的详细过程。

仔细看-classpath参数的解释就明白了吧,原来是我之前的classpath .是从当前路径.开始查找类的,当前类是哪里呢?从前面的图片中写出来了,是jre环境C:\Android\AndroidStudio\jre/bin/javah,所以只能找到java类,不能找到安卓的类。我们把安卓SDK路径添加进去那么javah就能够找到了。

还要注意classpath的配置语法,多个路径使用分号;隔开,所以解决方案就是前面所说的配置-classpath参数为D:\Android\Sdk\platforms\android-28\android.jar;.


总结


根据javah生成头文件的原理我们可以知道,任何参与JNI的类,都必须知道完整的包名路径。再假设我们使用了第三方库,有一些自定义的类,那么我们也应该把这个类的路径配置到-classpath参数中去。


目录
相关文章
|
7月前
|
安全 Android开发
修改Android系统的签名
修改Android系统的签名
148 0
|
Java Android开发 C++
【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( jni 中 main 函数声明 | 命令行处理 | jni 调用 lib7zr.so 函数库处理压缩文件完整代码 )(一)
【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( jni 中 main 函数声明 | 命令行处理 | jni 调用 lib7zr.so 函数库处理压缩文件完整代码 )(一)
216 0
【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( jni 中 main 函数声明 | 命令行处理 | jni 调用 lib7zr.so 函数库处理压缩文件完整代码 )(一)
|
编译器 C# 图形学
Unity与 DLL文件 ☀️| 怎样使用VC++生成一个DLL文件并调用!(包括 在VS 中调用 和 在Unity中调用)
📢前言 🎬通过VC 生成DLL文件 🎥在VS中生成DLL文件 🏳️‍🌈第一步:新建一个dll项目 🏳️‍🌈第二步:新建一个`.h头文件`和`.cpp源文件` 🏳️‍🌈第三步:在`.h头文件`和`.cpp源文件`中编写代码 🏳️‍🌈第四步:生成dll和lib文件 🎥在VS中进行调用DLL文件 🚩第一步:先来新建一个项目 🚩第二步:复制firstDLLTest.dll和firstDLLTest.lib文件和上一个项目的头文件firstDLLTest.h 🚩第三步:在新项目里面添加C++代码 🚩第四步:添加头文件firstDLLTest.h和firstDLLTest.
Unity与 DLL文件 ☀️| 怎样使用VC++生成一个DLL文件并调用!(包括 在VS 中调用 和 在Unity中调用)
|
Android开发
【Android 逆向】ART 脱壳 ( DexClassLoader 脱壳 | exec_utils.cc 中执行 Dex 编译为 Oat 文件的 Exec 和 ExecAndReturnC函数 )
【Android 逆向】ART 脱壳 ( DexClassLoader 脱壳 | exec_utils.cc 中执行 Dex 编译为 Oat 文件的 Exec 和 ExecAndReturnC函数 )
164 0
|
Java Android开发 C++
【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( jni 中 main 函数声明 | 命令行处理 | jni 调用 lib7zr.so 函数库处理压缩文件完整代码 )(二)
【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( jni 中 main 函数声明 | 命令行处理 | jni 调用 lib7zr.so 函数库处理压缩文件完整代码 )(二)
190 0
|
C++
将MFC Grid control封装为DLL的做法及其在DLL中的使用方法
MFCGrid control是一款非常优秀的网格控件,支持非常丰富的界面元素,如下图:   因而在数据库程序及报表程序应用较为广泛,其源码可以在下面下载到: MFC Grid control2.27源码下载        MFC Gridcontrol的作者并没有将其封装为DLL,因为在程序的多个模块复用这个控件比较麻烦(需要在多个工程中加入其源码),因此最好将其封装为一个DLL。
1716 1
|
C# 容器 API
C# 动态修改dll的签名 以及修改引用该dll文件的签名
原文:C# 动态修改dll的签名 以及修改引用该dll文件的签名 在读取RedisSessionStateProvider配置 提到用mono ceil 来修改程序集以及它的签名,里面GetPublicKey 和GetPubliKeyToken 方法里面那个字符串的获取 以及后来的签名 我们都应该 用code来实现,还有应用该dll文件的签名也一同需要修改。
2119 0
|
JSON Java 数据格式
Android--解包、添加文件、打包、签名
版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/79900485 package zip; import java.
996 0
|
Android开发 数据安全/隐私保护
build内配置签名与buildConfig妙用
向rom版本系统内写入之前内置的app需要打包成正式版才可以进行安装,所以在项目的Module的build内的添加如下代码即可实现直接运行既可安装到android设备内。
1173 0