Android Studio 生成.h头文件的方法之一
1、在任意class类 中编写一个native 方法。
public class MainActivity extends Activity {
/**
* 编写native 静态方法
*/
public native static String getJniStr();
/**
* 编写native 非方法
*/
public native String getJniStr2();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
2、 使用Android studio 自带的Terminal控制台,定位到 当前项目的的 java目录下
运行指令: javah -jni 包名.类名
会在根目录下生成名称为: Java_包名_类名_方法名.h 的文件
如图:
分析:
把 该.h 方法复制到 c/c++ 项目中,这里使用的 VS 2015
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class com_example_better_myapplication_MainActivity */
#ifndef _Included_com_example_better_myapplication_MainActivity
#define _Included_com_example_better_myapplication_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_better_myapplication_MainActivity
* Method: getJniStr
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_better_myapplication_MainActivity_getJniStr
(JNIEnv * enc, jclass jcla);
/*
* Class: com_example_better_myapplication_MainActivity
* Method: getJniStr2
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_better_myapplication_MainActivity_getJniStr2
(JNIEnv * enc, jobject jobj);
#ifdef __cplusplus
}
#endif
#endif
注意:直接拷贝到c/c++项目下回有错误:
1、首先,提示缺少 jni.h 和 jni_md.h ,这两个文件可以在 你的 JDK 安装目录中找到(JDK安装目录中搜索)
2、将 #include <jni.h> 改为 #include “jni.h” 因为<> 是引用系统的, “” 是引用自己添加的头文件
我们可以发现:
1、 每个native 函数,至少包含 两个参数 JNIEnv* jclass 或 joject
2、当 native 为静态方法是,jclass 代表 native方法所属的类
3、当native 为非静态方法时,jobject 代表 native 方法所属的对象