JNI學習之Android studio 生成.h 標頭檔案
阿新 • • 發佈:2018-11-02
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 方法所屬的物件