android ndk javah命令找不到Context或者Handler等sdk的class类

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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值