我的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);
  
}

解决方案 »

  1.   

    上个项目就是用的java调用C++的dll
    代码没看出有什么错误。
    看来也只有是逻辑的错误了,
    方法调用的顺序对吗?
    你仔细看下。
      

  2.   

    UI thread没有刷新界面? 不清楚JNI线程和UI线程是不是同一个
      

  3.   

    jobject o=e->NewObject(cls,methodCon);  //顺便请教这个o怎么释放? 
            e->CallVoidMethod(o,method,0); 
    你又new 了一个test,两个不同的test 实例当然不行。
    就像在java里写 new test().mySet(0) 如何释放问题:通常不需要释放。jni返回的时候会自动释放这些引用。
    就像在java里写 Object x = new Object();一样。
    如果一定要立即释放,调用JNIEnv.DeleteLocalRef
      

  4.   

    绝了!明白了!原来是这么回事!看来设计有问题,应该把native静态函数改为非静态的,这样参数里面就有jobject,通过这个jobject,就能获得jcalss,这样java程序的静态函数和非静态函数就都可以调用了。
      

  5.   

    //各位高手  小弟遇到的问题比较的简单  就是我点击一个button为什么就调用不了呢
    如果我不用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();
    }
    }