android ndk javah命令找不到Context或者Handler等sdk的class類
javah在ndk找不到Android相關的類
Android ndk開發的時候遇到了如果引用的class是Android的class,例如Context,Handler, Surface等Android sdk的類,javah就會找不到相關的類。
例如
package com.penny.demo;
import android.view.Surface;
public class MediaEntry {
static {
System.loadLibrary("native-lib");
}
public void setSurface(Surface surface) {
native_setSurface(surface);
}
private native void native_setSurface(Surface surface);
}
如果我們運行javah生成jni文件時,就會面臨找不到Surface的問題
$ cd build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/
$ javah -jni com.penny.demo.MediaEntry
Error: Class android.view.Surface could not be found.
這是因爲android.view.Surface是sdk裏面的類,並沒有在build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/下面。
解決
解決這個問題很簡單,把Android.jar的路徑加入到javah classpath即可
1、 在macos和linux上運行
javah -jni -classpath $ANDROID_HOME/platforms/android-28/android.jar:. com.penny.demo.MediaEntry
於是命令運行成功
com_penny_demo_MediaEntry.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_penny_demo_MediaEntry */
#ifndef _Included_com_penny_demo_MediaEntry
#define _Included_com_penny_demo_MediaEntry
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_penny_demo_MediaEntry
* Method: native_setSurface
* Signature: (Landroid/view/Surface;)V
*/
JNIEXPORT void JNICALL Java_com_penny_demo_MediaEntry_native_1setSurface
(JNIEnv *, jobject, jobject);
#ifdef __cplusplus
}
#endif
#endif
2、在windows下命令
linux和macos運行命令畢竟和windows有所差別,不過不影響。在windows上需要修改環境變量和分隔符
cmd> javah -jni -classpath %ANDROID_HOME%\platforms\android-28\android.jar;. com.penny.demo.MediaEntry