PS:要转载请注明出处,本人版权所有。

PS: 这个只是基于《我自己》的理解,

如果和你的原则及想法相冲突,请谅解,勿喷。

前置说明

  本文作为本人csdn blog的主站的备份。(BlogID=079)

  本文发布于 2019-02-14 13:29:50,现用MarkDown+图床做备份更新。blog原图已丢失,使用csdn所存的图进行更新。(BlogID=079)

环境说明

  无

原因


  1. 我之前写过一篇jni的文章,在那篇文中,我要为java jni静态注册补充一下,生成jni头文件相关的知识。
  2. 在我们使用as开发带jni的app的时候,我们自己写的java native 方法,可以通过一定方式方便的生成jni的头文件,但是我们没有关注他是怎么生成的?
  3. 在实际使用过程中,特别是测试过程中,或者为一个第三方c和c++库写jni接口时,手动生成jni头文件也是必须要掌握的。

方法


  1. 首先在java层写你的native方法,注意包名等等。我这里的例子如下:
package com;

public class shmem{

	static {

		System.loadLibrary("libandroid-shmem.so");
} public native int CreateSHMEM(int size); public native int AttachSHMEM(); public native int SetDataToSHMEM(byte[] data_buf); public native int GetDataFromSHMEM(byte[] data_buf, int size); public native int DetachSHMEM(); public native int MarkDeleteSHMEM(); };
  1. 使用java sdk带的javac命令编译这个java文件。(注意这里的包名为com。那么记得把shmem.java放到一个名为com的文件夹下面去。)
javac shmem.java
  1. 通过javah命令生成jni头文件。(注意这里是完整的类名,shmem.class 必须在com文件夹下面)
javah -jni com.shmem
  1. 生成的jni头文件实例
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_shmem */ #ifndef _Included_com_shmem
#define _Included_com_shmem
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_shmem
* Method: CreateSHMEM
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_com_shmem_CreateSHMEM
(JNIEnv *, jobject, jint); /*
* Class: com_shmem
* Method: AttachSHMEM
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_com_shmem_AttachSHMEM
(JNIEnv *, jobject); /*
* Class: com_shmem
* Method: SetDataToSHMEM
* Signature: ([B)I
*/
JNIEXPORT jint JNICALL Java_com_shmem_SetDataToSHMEM
(JNIEnv *, jobject, jbyteArray); /*
* Class: com_shmem
* Method: GetDataFromSHMEM
* Signature: ([BI)I
*/
JNIEXPORT jint JNICALL Java_com_shmem_GetDataFromSHMEM
(JNIEnv *, jobject, jbyteArray, jint); /*
* Class: com_shmem
* Method: DetachSHMEM
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_com_shmem_DetachSHMEM
(JNIEnv *, jobject); /*
* Class: com_shmem
* Method: MarkDeleteSHMEM
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_com_shmem_MarkDeleteSHMEM
(JNIEnv *, jobject); #ifdef __cplusplus
}
#endif
#endif

  这样我们就可以在生成的内容上修改修改就可以实际使用了。

  1. 题外话:其实我们使用as等ide自动生成jni头文件,其底层的原理就是这几句简单的shell命令。

后记


  无

参考文献

  • 无

打赏、订阅、收藏、丢香蕉、硬币,请关注公众号(攻城狮的搬砖之路)

PS: 请尊重原创,不喜勿喷。

PS: 要转载请注明出处,本人版权所有。

PS: 有问题请留言,看到后我会第一时间回复。

java 手动生成jni头文件(JNI静态注册)的更多相关文章

  1. Java 生成 JNI 头文件

    [参考文章]:javah javac 命令行生成native的方法教程 [参考文章]:用javah 导出类的头文件, 常见的错误及正确的使用方法 项目需要调用 C++动态库,由于项目包结构发生变化,需 ...

  2. ubuntu下整合eclipse和javah生成jni头文件开发android的native程序(转)

    本文介绍两种利用javah命令生成jni头文件的方法,第一种为大众所知的javah命令,第二种为整合javah到eclipse里面.推荐第二种方式,方便快捷,随时修改随时生成 0:前提和条件: 1:u ...

  3. ubuntu下整合eclipse和javah生成jni头文件开发android的native程序

    0:前言: 这两天一直在研究用android的jni调用第三方库,上网搜方法,但是都是泛泛而谈,没有demo,经过我几番折磨,写了n多的helloword工程,总是不成功,工程名字也就由helloow ...

  4. Android NDK入门实例 计算斐波那契数列一生成jni头文件

    最近要用到Android NDK,调用本地代码.就学了下Android NDK,顺便与大家分享.下面以一个具体的实例计算斐波那契数列,说明如何利用Android NDK,调用本地代码.以及比较本地代码 ...

  5. 一键生成JNI头文件方法二

    经常使用java的同学一定都接触过JNI(Java Native Interface)吧.JNI为我们提供了java<---->C/C++之间的接口,使得我们可以在java中调用C程序,以 ...

  6. [转]ubuntu下整合eclipse和javah生成jni头文件开发android的native程序

    转载自:http://blog.csdn.net/jiuyueguang/article/details/9404237 本文介绍两种利用javah命令生成jni头文件的方法,第一种为大众所知的jav ...

  7. kotlin gradle 生成jni头文件

    目录 问题 解决方法 使用方法 代码 gradle task位置截图 问题 最近在用kotlin写jni,但是生成头文件的时候遇到了些问题. 首先 javah 在java >= 1.9 就被取消 ...

  8. javah生成jni头文件时报错 Error: cannot access android.support...

    javah生成jni头文件时报错: Error: cannot access android.support.v7.app.AppCompatActivity class file for andro ...

  9. 使用javah生成jni 头文件和使用ndk编译so库

    1.jni 首先clean Project,在makeProject生成对应的class文件 然后点出命名框,输入命令: cd app/build/intermediates/classes/debu ...

  10. Android JNI入门第三篇——jni头文件分析

    一. 首先写了java文件: public class HeaderFile { private native void  doVoid(); native int doShort(); native ...

随机推荐

  1. ”动态“修改MAC地址

    一:获取MAC地址 1.自定义的MAC地址 这里是例程中存放自定义MAC地址的位置,如果想修改MAC地址可以在此处修改.一般例程这里是灰色的需要在工程预编译处配置. 可以看到MCU.c文件中此处代码生 ...

  2. TDBLookupComboboxEh 一些设置项,自己总结

    注意:如果top_seller_nick有重复的值的时候,keyfield 也为top_seller_nick的话,就会造成,选中最下面的那个阿里巴巴的,默认也是第一个天猫的各项值. 因为选后是根据k ...

  3. [JVM] JVM的类加载机制

    JVM的类加载 首先我们来看下Java虚拟机的类加载过程: 如上图. 当JVM需要用到某个类的时候,虚拟机会加载它的 .class 文件.加载了相关的字节码信息之后,会常见对应的 Class 对象,这 ...

  4. JS Leetcode 26. 删除有序数组中的重复项 题解分析,字典与快慢双指针

    壹 ❀ 引 本题来自LeetCode26. 删除有序数组中的重复项,是一道简单题,题目描述如下: 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组 ...

  5. Sunnyui画曲线溢出错误

    之前用sunnyui做展示数据库数据曲线的时候.偶然会报溢出错误,也不报错错误在哪,就是直接程序都跑不动了. 后面发现 设置曲线上下限的时候,当上下限一样的时候就会导致溢出错误.sunnyui的曲线也 ...

  6. SpringCloud 注册中心Zookeeper实战

    介绍 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提 ...

  7. OkHttp 拦截器的一些操作

    OkHttp 拦截器的一些操作  转自:  https://blog.csdn.net/songzi1228/article/details/116782794

  8. webservice之jax-ws实现方式(服务端)

    1.什么是webservice? webservice是一种远程资源调用技术,它的实现方式主要分为两种, 第一种是jaxws方式,它是面向方法的,它的数据类型是xml是基于soap实现传输: 第二种是 ...

  9. django学习第六天---shell指令,单表基于双下划线的模糊查询,distinct注意点,字段的choices属性,url反向解析,orm多表操作创建表

    shell指令 命令 python manage.py shell 在Terminal,执行上面这个指令会进入到python解释器环境中,并且加载了我们当前django项目配置环境,所以可以在当前sh ...

  10. 【Azure 存储服务】Azure Blob下面是否可以创建子文件夹

    问题描述 如何在Azure Storage Account(存储账户) 门户上为 Container 创建子文件夹? 问题解决 经验证,没有办法在门户上直接创建文件夹,不过可以使用Azure Stor ...