首页 > 解决方案 > OpenGL ES 应用程序和运行本机 Java 代码

问题描述

我正在使用 vs2017 创建 OpenGL ES 1 代码。我想从本机 C++ 执行 Java 代码。我正在尝试将我自己的 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();

我的问题是我无法实例化我自己放在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代码?

标签: javac++visual-studioandroid-ndkjava-native-interface

解决方案


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应符合SourcejniJava 约定。


推荐阅读