我正在使用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
。