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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011728480/article/details/87260113

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

#PS:这个只是 《 我自己 》理解,如果和你的

#原则相冲突,请谅解,勿喷

原因

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();
	
};

2 使用java sdk带的javac命令编译这个java文件。(注意这里的包名为com。那么记得把shmem.java放到一个名为com的文件夹下面去。)

javac shmem.java

在这里插入图片描述

3 通过javah命令生成jni头文件。(注意这里是完整的类名,shmem.class 必须在com文件夹下面)

javah -jni com.shmem

在这里插入图片描述

4 生成的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


这样我们就可以在生成的内容上修改修改就可以实际使用了。

5 题外话:其实我们使用as等ide自动生成jni头文件,其底层的原理就是这几句简单的shell命令。
#PS:请尊重原创,不喜勿喷

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

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

猜你喜欢

转载自blog.csdn.net/u011728480/article/details/87260113