精华内容
下载资源
问答
  • javah生成jni头文件
    2022-03-10 09:10:56

    Javah -jni -encoding UTF-8 com.example.jnitest.controller.TestController (javah生成jni头文件,UTF-8的编码生成,进入java目录下根据com..找到文件)

    javah命令在Java新的版本中已经被删除了,参考java15版本应该使用javac -h代替。

    cmake .  运行后

    make 编译 (无论什么环境下都需要编译,不然不会出现ddl或者so文件)

    jni的头文件在linux环境下必须使用linux版本的jdk

    更多相关内容
  • javah

    2021-07-29 14:12:23
    javah将native函数转换生成c头文件和源代码. C 可以用C代码(native source code)控制对象实例. 入参一般是Env环境信息(全局函数等),object对象,即类的实例. .h中结构体 如果存在,则对应类的结构. struct...
    1. 说明

      • 功能

        • javahnative函数转换生成c头文件和源代码.
      • C

        • 可以用C代码(native source code)控制对象实例.
        • 入参一般是Env环境信息(全局函数等),object对象,即类的实例.
      • .h中结构体

        • 如果存在,则对应类的结构.
        • struct字段对应类的字段.
      • 函数名字

        • Java_${package_name}_${function_name}.
      • 生成源代码

        • -stubs生成,-o则将结果汇总到一个文件.
      • JNI:Java Native Interface

        • 本身不需要头文件和源代码.只需要so.
        • 但是生成出来方便开发者进行开发JNI风格的代码.
        • 默认仅仅生成头文件.
    2. 格式

      • 完整

        • javah [ options ] fully-qualified-class-name ...
      • [options]

        • 可选参数.
      • fully-qualified-class-name

        • 将要被转化成c头文件或源代码类的完整类名.
        • ${package_name}.${class_name}比如java.util.lang.String.
        • 注意:没有.java后缀名.
        • 编译路径一般在最顶层.即包含package_name的目录.
        • 参考链接
      • 案例

        • 文件:/home/user/com/example/JavaHowTo.class
        • 包:com.example.JavaHowTo
        • 编译位置:/home/user
    3. 选项

      • -o output_file

        • 将生成的所有头文件或源代码拼接到一个输出文件.
        • -o,-d只能用一个,本身是冲突的.
      • -d directory

        • 将生成的头文件和源代码输出到一个文件夹.
        • -d,-o只能用一个.
      • -stubs

        • 生成C代码.
      • -verbose

        • 输出生成文件的信息到stdout.
      • -jni

        • 生成JNI格式的函数,默认.
        • 所以这个选项可选.
      • -classpath path

        • 指定查找给定class的位置.
        • 不指定用环境变量CLASSPATH.即-classpath > CLASSPATH
        • path格式是:分割,windows;分割.
        • path特殊,*表示.jar|.JAR结尾.
      • -bootclaspath

        • 加载引导类的路径.一般是jre/lib/rt.jar和几个其他JAR文件。
      • -force

        • 总是写入,而不是存在就不生成.
    4. 参考

    展开全文
  • javah编译jni

    2017-12-07 23:31:04
    在Android Studio3.0上用javah方式编译jni,并解决新问题
  • javah命令生成的后缀是.h的c语言的头文件,
  • javah是用于根据JAVA本地方法,生成对应的c语言头文件及相应的stub文件的命令,使用比较简单,使用示例可以查看如下: 先介绍下JNI(Java Native Interface)是Java本地方法调用接口,从Java1.1开始,Java Native ...

    javah是用于根据JAVA本地方法,生成对应的c语言头文件及相应的stub文件的命令,使用比较简单,使用示例可以查看如下:

    先介绍下JNI(Java Native Interface)是Java本地方法调用接口,从Java1.1开始,Java Native Interface(JNI)标准就成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。

    Java中很多地方都使用到了JNI,如System.arrayCopy方法:

    public static native void arraycopy(Object array1, int start1, Object array2, int start2, int length);

    那Java中为什么要使用JNI呢?这与Java产生的历史就有一定的关系了,Java刚开始被设计的时候就是为了跨平台,Java的字节码由JVM运行。Java跨平台是非常好的设计理念,这避免了因为换平台而不得不重新写一套代码的麻烦,可正是为了实现这样的特性,Java也失去了一些特性,如对操作系统底层的调用限制。JNI可以实现对操作系统底层的调用,JNI可以用来提高调用的速度,如我们上面提到的System.arrayCopy方法,它是直接和操作系统的内存进行交互,而省去了JVM和操作系统进行内存交换的步骤;JNI的另一个使用场景就是某些核心类库的实现可能需要跨包调用或者需要绕过其他Java安全性检查,如Java中的sun.misc.Unsaef实现。

        下面我们用两个实例来说明,如何创建自己的DLL,以及如何通过Java去调用这些DLL。

        示例一、不传参数的简单调用

        这个示例很简单,没有输入参数也没有输出参数,只是通过Java调用JNI方法,并把JNI中输出的一句话给显示出来。如果是涉及到输入输出参数的本地方法调用,相对就会麻烦一点,因为Java中的参数和DLL中的参数类型是不一样的,这时就需要一个中间转换间,如SWIG(Simplified Wrapper and Interface Generator)简单包装及接口生成器,这个后面会有介绍。

        1、Java的操作步骤

        1)、首先准备一个具有本地方法的Java文件JNITest,输入内容如下:

    package test;
    public class JNITest {
    	/*
    	 * 建立一个无返回参数的方法,该方法只在DLL方法内打印一条语句。 
    	 */
    	public native void test();
    }

    2)、使用Javac编译该Java文件 

    javac test/JNITest.java

     注:编译一定要在test包外操作,否则会报错。

    3)、使用Javah生成头文件

    javah test.JNITest

    注:也是要在test包外操作
    操作完成后,我们可以看到 头文件 "test_JNITest.h" ,它的命令方式是以包名加类名的方式,其内容如下: 

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class test_JNITest */
    #ifndef _Included_test_JNITest
    #define _Included_test_JNITest
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     test_JNITest
     * Method:    test
     * Signature: ()I
     */
    JNIEXPORT jint JNICALL Java_test_JNITest_test
      (JNIEnv *, jobject);
    #ifdef __cplusplus
    }
    #endif
    #endif

    正如文件头部所说,不要对这个生成文件进行任何的修改一样,然后通过C实现该方法即可: 

    JNIEXPORT jint JNICALL Java_test_JNITest_test (JNIEnv *, jobject);

    然后我们将实现后的C,编译成DLL,再将DLL放到操作系统的PATH中,如我是WINDOWS中,将其放到system32路径下即可,DLL的名称没有关系。

    4)、执行测试结果

        建立一个测试类JNITestCaller

    public class JNITestCaller {
    	static {
    		// 在系统路径中(如system32)加载名为JNITest.dll文件
    		System.loadLibrary("JNITest");
    	}
     
    	public static void main(String[] arg) {
    		JNITest jniTest = new JNITest();
    		jniTest.test();
    	}
    }

    通过javac编译该Java类 

    javac test/JNITestCaller

     然后执行它 

    java test.JNITestCaller

    如果控制台打印出“=====888”字符串,则表示通过JNI调用DLL成功且执行成功,如果不成功则检查步骤是否有遗漏。

        2、DLL编译的步骤

        1)、安装VC6, VS太大了,我等也不常用,这个可以了;

        2)、启动VC6,新建DLL工程,通过“File->New...->Dll工程”,名称就命名为JNITest吧,到时编译过后的DLL名称就是JNITest.dll,如果是其它的名称,在编译成DLL后需要改一下名称;

        3)、新建C++

        选中新建工程JNITest,然后点击菜单中的“File->New...->C++ Source File”,文件的名称可以任意,在其中输入如下代码:

    在其中输入如下如下代码:

    #include <jni.h>
    #include <stdlib.h>
    #include <test_JNITest.h>
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*这个方法名称一定要和头文件的一模一样,不过头文件中的参数只有类型,没有名称,需要加成如下参数*/
    JNIEXPORT void JNICALL Java_test_JNITest_test(JNIEnv *jenv, jobject jobj) {
      /*就打印这一条语句*/
      printf("=====888");
    }
    #ifdef __cplusplus
    }
    #endif

    4) 、将%JAVA_HOME%/include/win32下面的jawt_md.h、jni_mh.h,以及%JAVA_HOME%/include/jni.h,这三个文件拷贝到%VS_HOME%/VC98/Include下面,生成的头文件test_JNITest.h也可以拷贝到那个目录,省去指定头文件的路径步骤;
        5)、点击C++的编译按钮(或者CTRL+F7),不报错则通过,则点击生成DLL文件的按钮(或者F7),到%VS_HOME%/MyProject/JNITest目录,将JNITest.dll文件拷贝到system32目录就可以了。

        示例二、有输入输出参数的调用,需要借助工具SWIG(Simplified Wrapper and Interface Generator)

        Java中JNI的操作,最难的就是Java与Dll之间参数的传递与转换了,因为JAVA中的参数与C中的参数是不能够直接匹配的,如果我们手工去处理,还真的有点麻烦。这个时候我们可以通过SWIG这个工具来做参数的包装,它可以帮忙做传入传出参数之间的转换,我们现在上面的基础之上,将原来的void且不传参数的方法,改成传入两个字符串,返回的结果为这两个字符串的组合,如传入参数为"A"、"B",则输出结果为"AB",操作步骤如下:

        1、Java中的操作

        Java中需要将Native方法增加两个输入参数以及修改返回参数,这个Native方法的功能就是返回两个输入参数的拼接结果,如参数输入“A”和“B”,那要得到的结果是“AB”,修改后的包含Native方法的类的代码如下:

    package test;
    public class JNITest {
    	/*
    	 * 建立一个无返回参数的方法,该方法只在DLL方法内打印一条语句。 另外就是传参的处理要相对复杂点,后面介绍。
    	 */
    	public native String test(String a, String b);
    }

    此时我们的测试代码也会有一点点小小的改变,增加传入参数以及获取返回结果,修改后的JNITestCaller代码如下: 

    package test;
    public class JNITestCaller {
    	static {
    		// 在系统路径中(如system32)加载名为JNITest.dll文件
    		System.loadLibrary("JNITest");
    	}
     
    	public static void main(String[] arg) {
    		JNITest jniTest = new JNITest();
    		String a = "A", b = "B";
    		String result = jniTest.test(a, b);
    		System.out.println("The execute result is:" + result);
    	}
    }

    如果我们按照上面的操作,并 可以在最后得到输出结果“AB”,那么就表示我们的操作成功了。 

    2、DLL编译的步骤

        1)、首先是下载SWIG,要包括WIN的那个版本,这个版本才有SWIG.EXE这个文件;

        2)、然后设置SWIG当前路径到PATH中,因为执行SWIG命令的时候需要用到;

        3)、编写".i"文件如“I.i”,这个文件里面定义要生成的C方法是什么,这个方法就是要实现的方法,具体怎么写就需要看看SWIG的示例与帮助文档了,里面还是挺丰富的;

        4)、执行命令“swig -java -c++ I.i”,会生成C语言包装、C++包装、两个JAVA文件,其中包括了声明本地native方法类,以及引用方法native方法的类,但是在实现类中没有实现MAIN方法以及通过System.loadLibary的方法加载DLL,这两个需要用户自己完成。

        注:用户需要自己通过C或者是C++实现在".i"文件中声明的方法,才可以成功编译,因为C及C++的包装文件中会引用这个方法,我们不需要修改包装文件,直接在另外一个C或者是C++文件中实现那个文件即可。

        5)、调用和上面的一样,编译JAVA,执行JAVA,不过不用调用JAVAH生成H头文件了,因为由SWIG已经生成了对应的包装文件。

        这个没有给出示例,因为SWIG生成的包装文件比较大,它其中做了字符的转换,有了上面的基础,再通过SWIG去实现,应该没有多大难度。

        注:DLL的步骤,后面会补充完整。

    展开全文
  • JavaH指数.doc

    2021-07-12 17:15:52
    JavaH指数.doc
  • 在Android studio 中可以添加自定义工具,将javah指令添加进去 首先我们看下javah的指令格式 由此指令我们知道怎么使用javah指令 例如有java文件 D:\project\Test\app\src\main\java\com\example\test.java ...

    Android 做jni的时候 需要根据native java类生成对应的.h头文件,然后根据.h头文件写cpp文件。

    在Android studio 中可以添加自定义工具,将javah指令添加进去

    首先我们看下javah的指令格式

     由此指令我们知道怎么使用javah指令

    例如有java文件 D:\project\Test\app\src\main\java\com\example\test.java
    编译生成的class文件位于D:\project\Test\app\build\intermediates\javac\debug\classes\com\example\test.class
    要输出的头文件目录 D:\project\Test\app\src\main\cpp

    使用javah的指令为

    javah -classpath D:\project\Test\app\build\intermediates\javac\debug\classes\ -jni -d D:\project\Test\app\src\main\cpp com.example.test

    知道指令后,将这个指令添加到android studio

    File - Settings - 打开Settings

    Name: javah 显示的名称

    Description: javah  指令详情
    Program: javah 指令的路径,因为我电脑已经将javah加入环境变量了,可以在任何地方输javah都可以有返回,所以这里填javah,否则的话要填全路径

    Arguments: -classpath $OutputPath$ -jni -d $SourcepathEntry$\..\cpp $FileClass$   参照指令我们知道要输入什么参数,在输入框右侧点击 + 可以查看对应变量的路径。

    这里显示的路径信息是根据你android studio 工程当前打开什么文件,根据这文件展示路径信息的,选择对应路径信息,填入Arguments 里就行

    working directory:  指令在哪个路径下执行 这个路径就可以随便填,如果参数不填classpath的,这里的目录就要填class文件所在的目录D:\project\Test\app\build\intermediates\javac\debug\classes\ 

    配置完后,保存即可。

    使用的话就很简单,选中native java文件,右键选择External Tools--javah 即可生成头文件在-d 参数的目录下

     

     

    展开全文
  •      JNI/NDK开发指南之javah和javap的使用和集成   在前面的章节JNI/NDK开发指南之JNI数据类型,描述符详解中我们详细的讲解了数据类型,描述符等相关的概念。如果是刚开始接触JNI的话,读者看到那些概念...
  • java10,java11删除了javah。改用javac直接用源码生成jni头文件。 javac -h 目录 源码文件 cd 目录下 javac -h .\ FTPosNatives.java java8等以下版本 生成jni头文件 代码放在项目中编译生成.class文件...
  • 我需要javah和android-ndk的帮助。JAVAH找不到类(android ndk)我tryed生成H-文件我的本地方法,但JAVAH说类文件未找到。我的目标类有绝对的名称$ PROJECT_DIRECTORY/的src/BT/nativeclient/BtnativeActivity.java,...
  • javah命令的使用

    2021-02-27 16:52:54
    使用javah 命令生成C语言函数名使用javah命令生成C语言函数名(进入到与包名同级的目录下执行javah命令,习惯是com同级的目录)javah -d 文件生成路径 全类名javah -d C:\android\workspace\JniDemo\app\jni ...
  • 一、关于javah命令 javah命令主要用于在JNI开发的时,把java代码声明的JNI方法转化成C\C++头文件,以便进行JNI的C\C++端程序的开发。 -d 和-o 这两个参数用于设置生成的C\C++头文件的指定,该两参数选项不能...
  • javah生成java头文件

    千次阅读 2022-01-18 12:28:10
    2:Testjni.java代码 ... public class Testjni { public native String callNative();...cd到Test.jni所在的目录,编译java代码,生成class文件 ...4:输入 javah -classpath C:\Users\26913\Desktop\exportjni -.
  • 前言在开发 Android NDK 的时候,如果你是用 ndk-build 的方式,当在 Java 文件定义完 native 接口,按 ALT + ENTER 并不支持自动生成 cpp 文件,而手写 cpp 又非常容易写错,所以很有必要借助 javah 自动生成 .h ...
  • Javah生成JNI头文件

    2021-02-28 16:16:56
    首先确保java的环境变量配置好了。1:打开cmd进入doc命令窗口:进入class所在目录,我的class是在F:\summerVacation\ndkhelloworld\bin\classes(不要跟包名)我项目... 执行javah - jni com.pl.demo1.MainActivity(com...
  • OK之后会进行编译,出现第一种方式完成一样的结论 步骤五:生成.h文件 用cmd打开命令提示符(也可以用Cygwin执行相同的操作),定位到D:\java\NDK\android-ndk-r8b\MyPro\JNIMySecond\bin目录下,输入命令javah–jni...
  • 当前内容主要为javah的使用,并完成dll打包操作并实现java调用dll文件 主要内容: 使用javah生成.h文件 使用vs studio 2015实现.h文件并打包为dll 使用java方式调用dll 2. 使用javah生成.h文件 javah用于native...
  • JNI开发之javah生成静态和非静态的两个头文件区别
  • javah vs javac -h

    2021-03-25 16:51:25
    在高版本jak中javah已经被删除,用javac -h 代替。 具体使用方式是 #javap方式 javac Hello.java javah Hello #javac -h 方式 #javac -h {指定.h文件的位置} Hello.java javac -h ./ Hello.java 附:Hello.java ...
  • javah命令详解

    万次阅读 2018-04-26 16:49:33
    jni开发第一步,就是用javah命令生成生成c\c++头文件。 javah命令参数详解 cmd(默认配置jdk path) 执行javah -help 如下图: -d 和-o 这两个参数用于设置生成的C\C++头文件的指定,该两参数选项不能同时使...
  • javah生成C++头文件(.h)

    2021-02-12 12:43:12
    $ cd G:\work\eclipse\test\bin\esmart\colfile\parse $ set classpath=G:\work\eclipse\test\bin $ javah -classpath . -jni esmart.colfile.parse.TestHello 这样则在G:\work\eclipse\test\bin路径下就...
  • D:\我的文档\workspace\...javah -classpath D:\我的文档\workspace\PrepareForExam\src\com\example\myclass -d d:/ -jni com.example.myclass.jni_test错误:无法访问 com.example.myclass.jni_test未找到 com.ex...
  • javah’ 不是内部或外部命令,也不是可运行的程序或批处理文件。 在生成Java头文件时报错,经查询发现新版的Java不使用javah的命令了,而是使用javac -h 用法: javac –h <directory> <source files>...
  • javah头文件生成器

    2021-03-16 13:15:20
    javah头文件生成器javah程序创建C头文件和存根文件,这些是把本地C成员函数包入java 所需要的。被创建的头文件给出了有关java类的信息,这些信息是C成员函数与java类交换数据所必需的。存根文件将用来创建将定义...
  • 项目架构:B/S架构 开发语言:Java语言 开发软件:idea eclipse 前端技术:Layui、HTML、CSS、JS、JQuery等技术 后端技术:JAVA 运行环境:Win10、JDK1.8 数 据 库:MySQL5.7/8.0 运行服务器:Tomcat7.0 CSDN太坑了...
  • 项目架构:B/S架构 开发语言:Java语言 开发软件:idea eclipse 前端技术:Layui、HTML、CSS、JS、JQuery等技术 后端技术:JAVA 运行环境:Win10、JDK1.8 数 据 库:MySQL5.7/8.0 运行服务器:Tomcat7.0 CSDN太坑了...
  • 项目架构:B/S架构 开发语言:Java语言 开发软件:idea eclipse 前端技术:Layui、HTML、CSS、JS、JQuery等技术 后端技术:JAVA 运行环境:Win10、JDK1.8 数 据 库:MySQL5.7/8.0 运行服务器:Tomcat7.0 CSDN太坑了...
  • 初学java,想使用JNI,在用javah生成头文件时,总是报错找不到类;看了javah的help,本来是很简单的,但是由于自己概念含糊,所以出错。javah的命令行帮助:用法:javah [选项] 其中 [选项] 包括:-help 输出此帮助...
  • javaJNI(javah用法)

    千次阅读 2019-09-30 15:09:06
    二、javah命令 一、native关键字 native 即 JNI,Java Native Interface 凡是一种语言,都希望是纯。比如解决某一个方案都喜欢就单单这个语言来写即可。 Java平台有个用户和本地C代码进行互操作的API,称为Java ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,716
精华内容 9,486
关键字:

javah

java 订阅
友情链接: Laser_Temp_Gun.zip