1. 程式人生 > >JNI學習之Android studio 生成.h 標頭檔案

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 方法所屬的物件