我正在尝试用 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¸
求助各位大神给看看。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.