java - 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代码?
解决方案
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 约定。
推荐阅读
- php - 将变量输出为 html 而不是字符串 - PHP
- php - 如何在foreach中计算数组
- javascript - 将两个数字相乘时,浏览器是否支持数字输入框的分数?
- ionic-framework - 尝试在 android build 8,9 中从相机拍照时应用程序正在重新启动,并且在 ios build 中崩溃 - IONIC 4
- laravel - auth()->user() 在 ServiceProvider 中返回 null
- java - Spring Boot OAuth2/Cognito:通过 AccessToken 获取 UserInfo
- sql - 在单个 CLOB 中添加多个过滤选项(来自应用程序)生成动态 SQL 查询 - Oracle
- bash - 通过 SSH 终端在 Ubuntu Server 18.04 中执行 bash 脚本时无效
- html - 使用 routerLink 和 Fragment 未将焦点设置在元素上
- jquery - 自定义数据属性的查询字符串