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

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: 有问题请留言,看到后我会第一时间回复。

posted on 2023-02-11 17:28  SkyOnSky  阅读(404)  评论(0)    收藏  举报

导航