
我正在尝试用 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 leon0903 2019 年 3 月 8 日 我不太懂 jni,你试试把 const char *color; 换成 char []这样的数组试试 |