我正在使用vs2017创建OpenGL ES 1代码。我想从本地C++执行Java代码。我正在尝试将自己的Java文件添加到项目中。我在资源src/com/a/b/sourcejni.java下添加了它。

我不确定如何加载和与源类接口(interface)。 FindClass失败。同样在项目的任何地方都找不到模板生成的Java文件进行编辑。我检查了 list 以包含必要的字段。

这是我的C++代码:

 JavaVM* lJavaVM = User_Data.state->activity->vm;
 JNIEnv* lJNIEnv = User_Data.state->activity->env;

 JavaVMAttachArgs lJavaVMAttachArgs;
 lJavaVMAttachArgs.version = JNI_VERSION_1_6;
 lJavaVMAttachArgs.name = "NativeThread";
 lJavaVMAttachArgs.group = NULL;

 jint lResult = lJavaVM->AttachCurrentThread(&lJNIEnv, &lJavaVMAttachArgs);
 if (lResult == JNI_ERR)
  return;
   -------------------down to here works--------------------

 jobject lNativeActivity = User_Data.state->activity->clazz;



             --------Problem is Here---------

 jclass ClassNativeActivity = lJNIEnv->GetObjectClass(User_Data.state->activity->clazz); //This works but does not load correct class OR
 jclass ClassNativeActivity = lJNIEnv->FindClass("com/a/b/Sourcejni"); //Failes!

 if(ClassNativeActivity == NULL ){
     lJavaVM->DetachCurrentThread();
     return;
 }

  -----------------get variables, call functions here

 lJavaVM->DetachCurrentThread();

我的问题是我无法实例化放置在资源中jni/com/a/b/sourcejni.java文件中的自己的Java文件。 Java文件如下所示:
package com.a.b;

public class sourcejni {

    private String  nativeSampleRate;

    sourcejni( ) {
        nativeSampleRate="test123";
    }
    public void setStringAgain(){
        nativeSampleRate="321tset";
    }

    /*
     * Loading our lib
     */
    static {
        System.loadLibrary("sourcejni");
    }
}

我觉得我已经足够详细地描述了我的问题,但我不确定我是否能正确地做到这一点。

有没有办法运行自己的Java代码?

最佳答案

FindClass 接受完全限定的类名作为参数。因此,如果您的Java类是com.sourcejni.sourcejni.sourcejni,则应从

jclass ClassNativeActivity = lJNIEnv->FindClass("com/x/y/sourcejni"); //Failes!


jclass ClassNativeActivity = lJNIEnv->FindClass("com/sourcejni/sourcejni/sourcejni");

请注意,您的类名称为sourcejni,而程序包名称为com.sourcejni.sourcejni,因此完全限定的类名称为com/sourcejni/sourcejni/sourcejni。另外,仅供参考,Java类/接口(interface)名称应首字母大写,即sourcejni根据Java约定应为Sourcejni

09-10 20:06