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 ...
随机推荐
- Git Q&A
git入门 Q: 什么是git ? A: git是一种版本控制工具,也是程序员的"后悔药":当你在工程中写入一堆混乱的代码后,只要通过几行简单的git命令,就可以回退到任意一个提交 ...
- .NET Core开发实战(第9课:命令行配置提供程序)--学习笔记
09 | 命令行配置提供程序:最简单快捷的配置注入方法 这一节讲解如何使用命令行参数来作为配置数据源 命令行配置(提供程序的)支持三种格式的命令 1.无前缀的 key=value 模式 2.双中横线模 ...
- MySQL的执行流程和执行顺序
MySQL执行过程以及顺序 前言:MySQL在我们的开发中基本每天都要面对的,作为开发中的数据的来源,MySQL承担者存储数据和读写数据的职责.因为学习和了解MySQL是至关重要的,那么当我们在客户端 ...
- 从零开始的react入门教程(五),了解react中的表单,何为受控组件与非受控组件
壹 ❀ 引 我们在从零开始的react入门教程(四),了解常用的条件渲染.列表渲染与独一无二的key一文中介绍了react中常用的条件渲染操作,比如三元运算符,逻辑运算符等,结合react组件或者re ...
- Python def() 后的-> 符号的作用
python – 定义函数 def 后面的 ->,:表示的含义-> 常常出现在python函数定义的函数名后面,为函数添加元数据,描述函数返回的类型. : 表示参数的类型建议符示例: de ...
- 基于角色的权限控制(RBAC)介绍
什么是RBAC? RBAC(Role-Based Access Control)基于角色的权限控制.其基本思想是,对系统操作的各种权限不是直接授予具体的用户,而是在用户集合与权限集合之间建立一个角色集 ...
- shell脚本实现进度条程序
1.实现效果 2.shell脚本 #!/bin/bash i=0 bar='' index=0 arr=( "|" "/" "-" &quo ...
- js数组类型
js数组类型: 数组检测 1.判断变量是否为数组类型: arr1 instanceof Array Array.isArray(arr1); true 转换方法 toString()方法,以便返回数组 ...
- GYM-A. Golden Spirit等
1.题目链接:Problem - A - Codeforces 题意:桥两边有2 * n个不能独立过桥的老人,老人想到对面休息 re 分钟后返回原位置,每次过桥需要花费 cr 分钟,问最少需要多长时间 ...
- win32-ReadProcessMemory在x86和x64下运行
#include <iostream> #include <Windows.h> #include <winternl.h> #include <tchar. ...