Приложение OpenGL ES и работающий нативный код Java - PullRequest
0 голосов
/ 18 ноября 2018

Я использую vs2017 для создания кода OpenGL ES 1. Я хочу выполнить код Java из родного C ++. Я пытаюсь добавить свой собственный файл Java в проект. Я добавил это под ресурсами src/com/a/b/sourcejni.java.

Я не уверен, как загрузить и взаимодействовать с исходным классом. FindClass не удалось. Также нигде в проекте я не могу найти сгенерированные шаблоны Java-файлы для редактирования. Я проверил манифест на наличие необходимых полей.

Это мой код 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();

Моя проблема в том, что я не могу создать свой собственный файл Java, который я поместил в файл jni/com/a/b/sourcejni.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?

1 Ответ

0 голосов
/ 19 ноября 2018

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 должно начинаться с заглавной буквы, т. Е. sourcejni должно быть Sourcejni по соглашению Java.

...