JNI学习之Android studio 生成.h 头文件

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 方法所属的对象

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值