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

2018-12-21 14:42:43 +08:00
 slimhigh

我正在尝试用 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¸

求助各位大神给看看。

2496 次点击
所在节点    编程
1 条回复
leon0903
2019-03-08 16:03:38 +08:00
我不太懂 jni,你试试把 const char *color; 换成 char []这样的数组试试

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/519747

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX