java 手动生成jni头文件(JNI静态注册)
PS:要转载请注明出处,本人版权所有。
PS: 这个只是基于《我自己》的理解,
如果和你的原则及想法相冲突,请谅解,勿喷。
前置说明
本文作为本人csdn blog的主站的备份。(BlogID=079)
本文发布于 2019-02-14 13:29:50,现用MarkDown+图床做备份更新。blog原图已丢失,使用csdn所存的图进行更新。(BlogID=079)
环境说明
无
原因
- 我之前写过一篇jni的文章,在那篇文中,我要为java jni静态注册补充一下,生成jni头文件相关的知识。
- 在我们使用as开发带jni的app的时候,我们自己写的java native 方法,可以通过一定方式方便的生成jni的头文件,但是我们没有关注他是怎么生成的?
- 在实际使用过程中,特别是测试过程中,或者为一个第三方c和c++库写jni接口时,手动生成jni头文件也是必须要掌握的。
方法
- 首先在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();
};
- 使用java sdk带的javac命令编译这个java文件。(注意这里的包名为com。那么记得把shmem.java放到一个名为com的文件夹下面去。)
javac shmem.java
- 通过javah命令生成jni头文件。(注意这里是完整的类名,shmem.class 必须在com文件夹下面)
javah -jni com.shmem
- 生成的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
这样我们就可以在生成的内容上修改修改就可以实际使用了。
- 题外话:其实我们使用as等ide自动生成jni头文件,其底层的原理就是这几句简单的shell命令。
后记
无
参考文献
- 无
打赏、订阅、收藏、丢香蕉、硬币,请关注公众号(攻城狮的搬砖之路)
PS: 请尊重原创,不喜勿喷。
PS: 要转载请注明出处,本人版权所有。
PS: 有问题请留言,看到后我会第一时间回复。
java 手动生成jni头文件(JNI静态注册)的更多相关文章
- Java 生成 JNI 头文件
[参考文章]:javah javac 命令行生成native的方法教程 [参考文章]:用javah 导出类的头文件, 常见的错误及正确的使用方法 项目需要调用 C++动态库,由于项目包结构发生变化,需 ...
- ubuntu下整合eclipse和javah生成jni头文件开发android的native程序(转)
本文介绍两种利用javah命令生成jni头文件的方法,第一种为大众所知的javah命令,第二种为整合javah到eclipse里面.推荐第二种方式,方便快捷,随时修改随时生成 0:前提和条件: 1:u ...
- ubuntu下整合eclipse和javah生成jni头文件开发android的native程序
0:前言: 这两天一直在研究用android的jni调用第三方库,上网搜方法,但是都是泛泛而谈,没有demo,经过我几番折磨,写了n多的helloword工程,总是不成功,工程名字也就由helloow ...
- Android NDK入门实例 计算斐波那契数列一生成jni头文件
最近要用到Android NDK,调用本地代码.就学了下Android NDK,顺便与大家分享.下面以一个具体的实例计算斐波那契数列,说明如何利用Android NDK,调用本地代码.以及比较本地代码 ...
- 一键生成JNI头文件方法二
经常使用java的同学一定都接触过JNI(Java Native Interface)吧.JNI为我们提供了java<---->C/C++之间的接口,使得我们可以在java中调用C程序,以 ...
- [转]ubuntu下整合eclipse和javah生成jni头文件开发android的native程序
转载自:http://blog.csdn.net/jiuyueguang/article/details/9404237 本文介绍两种利用javah命令生成jni头文件的方法,第一种为大众所知的jav ...
- kotlin gradle 生成jni头文件
目录 问题 解决方法 使用方法 代码 gradle task位置截图 问题 最近在用kotlin写jni,但是生成头文件的时候遇到了些问题. 首先 javah 在java >= 1.9 就被取消 ...
- javah生成jni头文件时报错 Error: cannot access android.support...
javah生成jni头文件时报错: Error: cannot access android.support.v7.app.AppCompatActivity class file for andro ...
- 使用javah生成jni 头文件和使用ndk编译so库
1.jni 首先clean Project,在makeProject生成对应的class文件 然后点出命名框,输入命令: cd app/build/intermediates/classes/debu ...
- Android JNI入门第三篇——jni头文件分析
一. 首先写了java文件: public class HeaderFile { private native void doVoid(); native int doShort(); native ...
随机推荐
- react 快速接入 sentry,性能监控与错误上报踩坑日记
壹 ❀ 引 本文是我入职第一个月所写,在主导基建组的这段时间也难免会与错误监控和性能监控打交道,因为公司主要考虑接入sentry,所以对于接入sentry的基建任务也提了一些需求,主要分为: 支持查看 ...
- NC16641 [NOIP2007]守望者的逃离
题目链接 题目 题目描述 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变.守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上.为了杀死守望者,尤迪安开始对这个荒岛施咒 ...
- NC16655 [NOIP2005]过河
题目链接 题目 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可 ...
- 【Unity3D】人体模型及动画
1 前言 2D动画 中初步了解了 Animation 和 Animator,本文将进一步学习 3D 动画,并介绍 人体模型相关内容. 模型制作软件主要有:3DMax.Maya,模型存储格式主要 ...
- SpringCloud Alibaba Sentinel实现熔断与限流<2020-9>
SpringCloud Alibaba Sentinel 1.Sentinel是什么? 1.1.前言说明: 作用:实现熔断与限流 (Hystrix断路器 升级版) 文档直达: 官网中文文档 1.2.S ...
- 2022年3月核心库MySQL优化总结
2021年9月底到新公司,公司核心数据库,以前无专业DBA维护,问题多,隐患大,到2022年2月持续后,优化至今: 优化大项: 1,从1主3从,扩容到1主5从,将部分读放都另外新加从库 2,最大表 ...
- golang指针和结构体
指针 指针操作 指针包括指针地址.指针类型和指针取值 &: &符号放在变量前面进行取地址操作 **:*放在变量前面根据地址进行取值 指针地址: func main() { var a ...
- 新零售SaaS架构:什么是订单履约系统?
什么是订单履约系统? 订单履约系统用来管理从接到销售订单,到把货品送到客户手中的整个业务过程.它是上游交易(如销售和客户下单环节)和下游仓储配送(如库存管理.物流)之间的桥梁,确保信息流的顺畅和操作的 ...
- 一秒出图?SDXL-Turbo实时AI绘画整合包下载
SDXL Turbo是一种快速生成的AI构图模型,它基于一种称为对抗性扩散蒸馏的新训练方法,该方法允许在1到4个步骤中以高图像质量对大规模基础图像扩散模型进行采样,并将其与对抗性损失相结合,以确保即使 ...
- 正则函数及面向对象开发初识---day19
1.正则函数 # ### 正则函数 import re #search 通过正则匹配出第一个对象返回,通过group取出对象中的值 strvar = "1+2 3*4" obj = ...