gpt4 book ai didi

java - 从 C++ 访问在 Java 代码中创建的对象

转载 作者:行者123 更新时间:2023-11-30 02:55:10 26 4
gpt4 key购买 nike

我最终尝试实现的是从 C++ 中启动一个 java 程序,然后使用 JNI 与其交互。

因此,我创建了一个简单的测试环境来四处游荡并了解更多有关 JNI 及其使用方法的信息。

这是我目前所拥有的:

示例 2.java:

public class Sample2 {

JLabel testLabel;

public static boolean booleanMethod(boolean bool) {
return !bool;
}

public Sample2(){
JFrame frame = new JFrame("FrameDemo");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
testLabel = new JLabel("test");
testLabel.setPreferredSize(new Dimension(175, 100));
frame.getContentPane().add(testLabel, BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
}

public static void main(String[] args) {
new Sample2();
}

public void changeLabel(String s){
testLabel.setText(s);
}
}

JNITest.cpp:

int _tmain(int argc, _TCHAR* argv[])
{
JavaVMOption options[3];
static JNIEnv *env;
JavaVM *jvm;
JavaVMInitArgs vm_args;
long status;
jclass cls, stringClass;
jmethodID mid;
jstring jstr;
jobjectArray args;
jobject obj;

options[0].optionString = "-Djava.class.path=D:\\Studie\\EXP\\Code\\Workspace\\JNItest\\bin"; //2APL\\build"; //Workspace\\JNItest\\bin";
options[1].optionString = "-verbose";
options[2].optionString = "-verbose:jni";
memset(&vm_args, 0, sizeof(vm_args));
vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 1;
vm_args.options = options;
status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);

if (status != JNI_ERR) {
cls = env->FindClass("Sample2");
if(cls !=0) {
mid = env->GetStaticMethodID(cls, "main", "([Ljava/lang/String;)V");
if(mid !=0) {
jstr = env->NewStringUTF("-nojade");
stringClass = env->FindClass("java/lang/String");
args = env->NewObjectArray(1, stringClass, jstr);
env->CallStaticVoidMethod(cls, mid, args);
}

现在我接下来要做的是通过调用 changeLabel(String s) 来更改框架的标签。方法。

            mid = env->GetMethodID(cls, "changeLabel", "(Ljava/lang/String;)V");
jstr = env->NewStringUTF("foobar");
env->CallIntMethod(...?, mid, jstr);

}
jvm->DestroyJavaVM();
return 0;
}
else {
return -1;
}
}

感谢Roger Rowland谁回答了my previous question我知道env->CallIntMethod(...?, mid, jstr);需要一个对象才能工作。但实际上已经在 main(String[] args) 中创建了一个 Sample2 对象的实例。调用,所以我的主要问题是,如何访问在 public static void main(String[] args) 中创建的对象在 C++ 中形成以将其传递给 env->CallIntMethod(...?, mid, jstr);以更改标签。

免责声明:我删除了一些检查以减少代码的长度,但我仍然可以确保在 env->CallIntMethod(...?, mid, jstr); 之前一切都按预期工作。

最佳答案

how can I access the object created in public static void main(String[] args)

没办法。从您的代码中可以清楚地看到在本地声明的实例。这就是为什么您需要在 Java 代码中声明静态字段:

static Sample2 instance;
public static void main(String[] args) {
instance = new Sample2();
}

之后你可以通过

从类中解析字段 instance
fid = (*env)->GetStaticFieldID(
env, cls, "instance", "LSample2;");

或者,如果您的 main 真的很简单,您可以直接从 C++ 代码实例化 Sample2 - 即使不调用 main

关于java - 从 C++ 访问在 Java 代码中创建的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16646849/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com