首页 > 编程语言 >java 手动生成jni头文件(JNI静态注册)

java 手动生成jni头文件(JNI静态注册)

时间:2023-02-11 17:33:26浏览次数:38  
标签:java jint shmem 头文件 jni com

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
rep_img
  1. 通过javah命令生成jni头文件。(注意这里是完整的类名,shmem.class 必须在com文件夹下面)
javah -jni com.shmem
rep_img
  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命令。




后记


  无

参考文献




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

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

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

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

标签:java,jint,shmem,头文件,jni,com
From: https://www.cnblogs.com/Iflyinsky/p/17112181.html

相关文章

  • 逻辑运算符 java 230211
    符号例子//写一个种序判断这个工作要不要去//要求1:要求资金大于4000并且距离小于10公里//逻辑与:左右两边同时满足,才成立booleanb=money>=4000&&distance<10;S......
  • 三元运算符 java 230211
    格式例子//三元运算符//小明的体温用变量temp保存,我们要判断他是否发烧doubletemp=36.6;//返回值=条件表达式?条件成立时的返回内容:条件不成立时的返回内容Stringre......
  • 运算符的优先级 java 230211
    优先级......
  • 练习 交换两个变量的值 java 230211
    代码//变量交换演练inta=2;intb=7;//方案一//intc=a;//a=b;//b=c;//System.out.println(a);//......
  • Java多线程07——JUC并发包03
    1线程的锁的synchronized、Lock、volatile区别1.1synchronized和volatile区别用法:volatile关键字解决的是变量在多个线程之间的可见性;synchronized关键字解决的是多......
  • Java+Selenium自动化
    学习地址:https://56data.cc/2150.html#4.2https://blog.csdn.net/weixin_45203607/article/details/125895112https://www.selenium.dev/zh-cn/documentati......
  • 一元运算符 java 230211
    符号一元运算符指的是只有一个元素参与运算用法变量++++变量变量----变量体验结果是变量值+1区别情况1:返回值= 变量++返回值是变量的原始值情况2:返回值=++变量返回值是......
  • 赋值运算符 java 230211
    符号体验赋值运算符......
  • Java学习File之递归
    递归概述:以编程的角度来看,递归指的是方法定义中调用方法本身的现象.递归解决问题的思路:把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解递归策略只需......
  • 关系运算符 java 230211
    符号体验关系运算符注意1判相等与不相等判两个数据是否相等,使用==符号判两个数据是否不相等,使用!=符号注意2区分这两个符号===......