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. (C语言)每日代码||2023.12.24||printf换行的三种方法

    #include <stdio.h> int main() { //printf()函数不同参数间可以换行 printf("num one : %d,num two : %d&q ...

  2. 18. 默认堆/创建堆--《Windows核心编程》

    Windows 提供了以下三种机制来对内存进行操控虚拟内存:最适合用来管理大量对象数组或者大型数据结构内存映射文件:最适合用来管理大型数据流(通常是文件),以及在同一机器上运行的多个进程之间的共享数据 ...

  3. 如何使用Ghost对UEFI+GPT+WIN10进行备份还原?

    以前BIOS兼容模式下用MBR分区表来备份还原系统使用Ghost很轻松就可以完成系统还原和备份,对于新版BIOS及支持GPT+UEFI快速启动的系统来说又应该如何备份还原呢?答案依旧是Ghost,只不 ...

  4. ASP.NET Core分布式项目实战(Consent Controller Get请求逻辑实现)--学习笔记

    任务20:Consent Controller Get请求逻辑实现 接着上一节的思路,实现一下 ConsentController 根据流程图在构造函数注入 IClientStore,IResourc ...

  5. HBase-compact的作用、两种实现方式、触发时机

    了解Flush触发条件后,这里产生了一个问题,频繁的flush会产生大量小文件,在对hbase进行查询时会产生大量IOPS,读取性能会受到很大的影响,同时也会给hdfs造成一定压力,hbase提供了一 ...

  6. UVA12024 Hats 题解

    题目传送门 前置知识 错位排列 题意 有 \(t\) 组询问,每次询问给定一个 \(n\),表示有 \(n\) 个人,每人各有一个属于自己的帽子,求所有人都带错帽子的概率(不要求约分至最简形式). 解 ...

  7. P1405 苦恼的小明 题解

    题目传送门 前置知识 扩展欧拉定理 解法 本题幂塔是有限层的,这里与 luogu P4139 上帝与集合的正确用法 中的无限层幂塔不同,故需要在到达递归边界 \(n+1\) 时进行特殊处理,对于处理 ...

  8. 【开工大吉】推荐4款开源、美观的WPF UI组件库

    前言 经常有小伙伴在技术群里提问:WPF有什么好用的UI组件库?,今天大姚给大家推荐4款开源.美观的WPF UI组件库. WPF介绍 WPF 是一个强大的桌面应用程序框架,用于构建具有丰富用户界面的 ...

  9. let与const

    let与const ES2015(ES6)新增加了两个重要的JavaScript关键字: let和const. 块级作用域 代码块内如果存在let或者const,代码块会对这些命令声明的变量从块的开始 ...

  10. Table布局

    Table布局 <table>最常用的也是最正确的使用方法是制作表格,由于其对占据的空间有着划分的作用,便可以使用<table>来布局. 实例 实现一个简单的布局,将表格的bo ...