无法从调用Java代码的本机代码获取类引用 [英] Failed To Get Class Reference from Native code invoking Java Code

查看:46
本文介绍了无法从调用Java代码的本机代码获取类引用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是Java编程的新手.我正在尝试使用JNI从本机C ++代码调用Java API.我收到以下错误 无法获取类参考" 下面是代码片段 Java方面:

I'm new to Java Programming. I'm trying to call Java API's from Native C++ code using JNI. I'm getting the following error "Failed To Get Class Reference" Below is the code snippet Java Side:

package com.example.playaudio;

import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener{
        private MediaPlayer mp;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                setVolumeControlStream(AudioManager.STREAM_MUSIC);
                Button button1=(Button)findViewById(R.id.button_1);
                Button button2=(Button)findViewById(R.id.button_2);
                button1.setOnClickListener(this);
                button2.setOnClickListener(this);
        }

        public void onClick(View v) {
                int resId;
                switch (v.getId()) {
                case R.id.button_1:
                        resId = R.raw.a;
                        break;
                case R.id.button_2:
                        resId = R.raw.b;
                        break;
                default:
                        resId = R.raw.a;
                        break;
                }
                // Release any resources from previous MediaPlayer
                if (mp != null) {
                        mp.release();
                }
                // Create a new MediaPlayer to play this sound
                mp = MediaPlayer.create(this, resId);
                mp.start();
        }
        public void onStart() {
                int resId;
                // Release any resources from previous MediaPlayer
                if (mp != null) {
                        mp.release();
                }
                resId = R.raw.b;
                // Create a new MediaPlayer to play this sound
                mp = MediaPlayer.create(this, resId);
                mp.start();
        }
}

本机端(带有JNI的C ++):

Native Side(C++ with JNI):

JavaVM * create_vm() {
    JavaVM   *jvm;
    JNIEnv  *env;

    JavaVMInitArgs vm_args;
    JavaVMOption *options   = new JavaVMOption[1];
    options[0].optionString = "-Djava.class.path=.";

    vm_args.version  = JNI_VERSION_1_6;
    vm_args.nOptions = 1;
    vm_args.options  = options;
    vm_args.ignoreUnrecognized = false;

    // Load and Initailize JVM, returns an JNI Intterface
    int ret = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
    if (ret < 0 )
            printf("Unable to launch JVM \n");

    return jvm;
}

void PlayAudio()
{
    int status;
    bool isAttached = false;
    JNIEnv *env;


    printf("PlayAudio\n");
    status = gJavaVM->GetEnv((void **) &env, JNI_VERSION_1_6);


    status = gJavaVM->AttachCurrentThread((void **)&env, NULL);


    jclass interfaceClass =
            env->FindClass("com/example/playaudio/MainActivity");
    if(!interfaceClass) {
            printf("PlayAudio: Failed To Get Class Reference\n");
            return;
    }

    jmethodID altmethod = env->GetMethodID(interfaceClass, "<init>","()V");
    jobject obj = env->NewGlobalRef(env->NewObject(interfaceClass, altmethod));

    jmethodID method = env->GetMethodID(interfaceClass, "onStart", "(I)V");
    if(!method)
    {
            printf("PlayAudio: Failed To Get Object Method\n");
            return;
    }
    env->CallVoidMethod(obj, method, NULL);
}

如果我的编码中有任何错误,请纠正我.以下是错误

Please correct me if anything is wrong in my coding.Following is the error

PlayAudio

PlayAudio

Exception in thread "main" java.lang.NoClassDefFoundError: com/example/playaudio/MainActivity
Caused by: java.lang.ClassNotFoundException: com.example.playaudio.MainActivity
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
PlayAudio: Failed To Get Class Reference

最好的问候 库马尔

推荐答案

您可以尝试的第一步是在选项值上给出Java类的修复路径: options [0] .optionString ="-Djava.class.path =."; ==>改为设置Java库的完整路径 如果它不起作用,那么我怀疑将Java方法公开给本机库的步骤.请仔细检查您是否将Java类编译到类文件中,以便本机库可以对其进行引用.

you can try first step is give the fix path to your Java class on option value: options[0].optionString = "-Djava.class.path=."; ==> Set full path your Java library instead If it does NOT work, i have doubt about steps you expose Java method to your native library. Please double check whether or not you compiled java class into class file in order that native library can make a reference to it.

这篇关于无法从调用Java代码的本机代码获取类引用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆