V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
slimhigh
V2EX  ›  编程

Swig 封装 Java Binding,输出 char * 字符串为乱码

  •  
  •   slimhigh · 2018-12-21 14:42:43 +08:00 · 2567 次点击
    这是一个创建于 2171 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我正在尝试用 Swig 封装 C++ 代码给 Java 调用。

    下面是我的 C++ 源代码:

    circle.h

    class Circle
    {
      private:
        double r;
        const char *color;
      public:
        Circle(double R, const char *color);
        double area();
        const char* getColor() ;
    };
    
    

    circle.cpp

    
    #include "circle.h"
    
    Circle::Circle(double R, const char* color)
    {
        this->r = R;
        this->color = color;
    }
    
    double Circle::area()
    {
        return 3.14 * r * r;
    }
    
    const char* Circle::getColor()
    {
        return color;
    }
    

    为 swig 写了一个 circle.i 文件。

    circle.i

    %module CircleModule
    %{
    #include "circle.h"
    %}
    %include "circle.h"
    

    执行 swig 命令:

    swig -c++ -java -outdir ./build/ circle.i
    

    生成 wrap 文件和 Java 类:

    circle_wrap.cxx
    build/CircleModule.java
    build/CircleModuleJNI.java
    build/Circle.java 
    

    编译动态链接库:

    g++ circle.cpp circle_wrap.cxx -I/usr/lib/jvm/java-1.8.0/include/ -I/usr/lib/jvm/java-1.8.0/include/linux -fpic -shared -o ./build/libcircle.so
    

    然后 Java 就可以通过刚才生成的 Java 类调用 libcircle.so 的代码了,下面是我的 Java Demo

    App.java

    public class App {
      static {
        System.loadLibrary("circle");
      }
    
      public static void main(String[] args) {
        Circle circle = new Circle(10, "red");
        System.out.println(circle.area());
        System.out.println(circle.getColor());
      }
    }
    

    这里的问题是输出circle.getColor() 的返回值始终是乱码,而不是初始化的 "red"。而且每次调用输出都不一样:

    $ java App
    314.0
    à*¤÷
    
    $ java App
    314.0
    PLX�
    
    $ java App
    314.0
    PP¸
    

    求助各位大神给看看。

    1 条回复    2019-03-08 16:03:38 +08:00
    leon0903
        1
    leon0903  
       2019-03-08 16:03:38 +08:00
    我不太懂 jni,你试试把 const char *color; 换成 char []这样的数组试试
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2471 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 15:55 · PVG 23:55 · LAX 07:55 · JFK 10:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.