我的java程序是一个JFC窗体,有一个按钮,一个Label控件,一个java函数mySet的功能是改变Label的
text,还有一个native函数将由c++ DLL实现。然后在DLL实现这个函数,功能就是调用java程序的mySet函数改变Label的text,现在的问题是Label的text已经“内部”改变了,但是没有在窗体上显示,也就是说,设原来Label上的text是“label”,DLL通过mySet函数把Label上的text改为“123”,通过label.getText()返回的结果是“123”,正确,但是窗体上Label上的text还是原来的label”,我试了label.repaint(), this.repaint()等都没有用,但是如果在java程序直接调用mySet则显示正常,大家帮我看看到底是怎么回事,核心源代码在下面:java:class test extends JFrame {JLabel label=new JLabel("text");
JButton btn1=new JButton("connect");
public native static void connect(); public test() {
JButton btn1=new JButton("connect");
btn1.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
test.connect();
//mySet(0); //如改成这样,可以正确显示
}
});
this.setLayout(new FlowLayout());
this.getContentPane().add(btn1); }
public void mySet(float f)
{
label.setText("123"); //显示结果还是“text”,没有变成“123”
System.out.println(label.getText()); //结果是"123"
JOptionPane.showMessageDialog(this,"11"); //OK
}
}DLL:
JNIEXPORT void JNICALL Java_opcjni_connect(JNIEnv *e, jclass cls)
{
jmethodID method;
jmethodID methodCon; method=e->GetMethodID(cls,"mySet","(F)V");
methodCon=e->GetMethodID(cls,"<init>","()V");
jobject o=e->NewObject(cls,methodCon); //顺便请教这个o怎么释放?
e->CallVoidMethod(o,method,0);
}
text,还有一个native函数将由c++ DLL实现。然后在DLL实现这个函数,功能就是调用java程序的mySet函数改变Label的text,现在的问题是Label的text已经“内部”改变了,但是没有在窗体上显示,也就是说,设原来Label上的text是“label”,DLL通过mySet函数把Label上的text改为“123”,通过label.getText()返回的结果是“123”,正确,但是窗体上Label上的text还是原来的label”,我试了label.repaint(), this.repaint()等都没有用,但是如果在java程序直接调用mySet则显示正常,大家帮我看看到底是怎么回事,核心源代码在下面:java:class test extends JFrame {JLabel label=new JLabel("text");
JButton btn1=new JButton("connect");
public native static void connect(); public test() {
JButton btn1=new JButton("connect");
btn1.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
test.connect();
//mySet(0); //如改成这样,可以正确显示
}
});
this.setLayout(new FlowLayout());
this.getContentPane().add(btn1); }
public void mySet(float f)
{
label.setText("123"); //显示结果还是“text”,没有变成“123”
System.out.println(label.getText()); //结果是"123"
JOptionPane.showMessageDialog(this,"11"); //OK
}
}DLL:
JNIEXPORT void JNICALL Java_opcjni_connect(JNIEnv *e, jclass cls)
{
jmethodID method;
jmethodID methodCon; method=e->GetMethodID(cls,"mySet","(F)V");
methodCon=e->GetMethodID(cls,"<init>","()V");
jobject o=e->NewObject(cls,methodCon); //顺便请教这个o怎么释放?
e->CallVoidMethod(o,method,0);
}
代码没看出有什么错误。
看来也只有是逻辑的错误了,
方法调用的顺序对吗?
你仔细看下。
e->CallVoidMethod(o,method,0);
你又new 了一个test,两个不同的test 实例当然不行。
就像在java里写 new test().mySet(0) 如何释放问题:通常不需要释放。jni返回的时候会自动释放这些引用。
就像在java里写 Object x = new Object();一样。
如果一定要立即释放,调用JNIEnv.DeleteLocalRef
如果我不用button的事件调的话就可以调用 Vc++中的代码,请问为什么啊import java.awt.FlowLayout;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.text.StyledEditorKit.ForegroundAction;public class HelloWorld {
public native void displayHelloWorld();
static {
System.loadLibrary("jnitest"); // jnitest 为动态链接的名称,可以更改。
}
public static void main(String[] args) {
JButton action = new JButton("一个Swing按钮");
JFrame frame = new JFrame("JNI 测试");
frame.setSize(640, 480);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new FlowLayout());
frame.getContentPane().add(action);
frame.setVisible(true);;
action.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
}
public static void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
System.out.println("testvc");
new HelloWorld().displayHelloWorld();
}
}