c/c++语言开发共享SWIG将生成的类从不同的模块和包导入当前类

我很难让SWIG类型映射(javapackage)正常工作。 我尝试制作一个问题的简单版本,即使这似乎也失败了。

foo.h中:

#ifndef FOO_H #define FOO_H class Foo { public: Foo() {}; int doSomething() { return 1 }; }; #endif 

bar.h:

 #ifndef BAR_H #define BAR_H #include "foo.h" class Bar { public: Bar() {}; int doSomething(Foo foo) { return foo.doSomething(); }; }; #endif 

Foo.i

 %module FooMod %include "typemaps.i" %include "stdint.i" %{ #include "../header/foo.h" %} %include "../header/foo.h" 

Bar.i

 %module BarMod %import "Foo.i" %typemap("javapackage") Foo, Foo *, Foo & "com.me.t.foo"; %include "typemaps.i" %include "stdint.i" %{ #include "../header/bar.h" %} %include "../header/bar.h" 

使用以下命令运行它们:

 swig -c++ -java -package com.me.t.foo -outdir ../../src/com/me/t/foo -o ../src/Foo.cpp Foo.i swig -c++ -java -package com.me.t.bar -outdir ../../src/com/me/t/bar -o ../src/Bar.cpp Bar.i 

我得到这个输出:

 package com.me.t.bar; public class Bar { private long swigCPtr; protected boolean swigCMemOwn; protected Bar(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } protected static long getCPtr(Bar obj) { return (obj == null) ? 0 : obj.swigCPtr; } protected void finalize() { delete(); } public synchronized void delete() { if (swigCPtr != 0) { if (swigCMemOwn) { swigCMemOwn = false; BarModJNI.delete_Bar(swigCPtr); } swigCPtr = 0; } } public Bar() { this(BarModJNI.new_Bar(), true); } public int doSomething(Foo foo) { return BarModJNI.Bar_doSomething(swigCPtr, this, Foo.getCPtr(foo), foo); } } 

BarModJNI.java:

 package com.me.t.bar; public class BarModJNI { public final static native long new_Bar(); public final static native int Bar_doSomething(long jarg1, Bar jarg1_, long jarg2, Foo jarg2_); public final static native long Bar_getFoo(long jarg1, Bar jarg1_); public final static native void delete_Bar(long jarg1); } 

文件生成正确,但请注意没有import语句 ,因此无法从任何Bar Java类中找到Foo 。 这是一个简单的例子,但只是硬编码import语句对我来说不是一个选项,因为生成的包含C JNI代码的源文件可能具有“Foo”类文件的错误位置。

这似乎是一个非常简单和常见的问题,所以,我想知道的是,如果我错过了什么或者我做错了什么。

谢谢您的帮助!

    得到了同样的问题并找到了答案,因此将其发布给社区。

    您需要进行3次更改。

    参考:

    关于Zbigniew提供的答案,只有几点意见。 我遇到了这篇文章中描述的同样问题。 我想澄清两点。

    首先,在我看来,第1步是在JNI包装类(whateverJNI.java)中添加导入,而第2步是在特定类中添加导入。

    其次,第2步对我不起作用,而不是%typemap(javaimports) 我不得不使用%typemap(javaimports) SWIGTYPE 。 糟糕的是它将导入添加到所有生成的java类,而不仅仅是所需的类。

    最后,我仍然遇到SWIG在包装特定类型时无法识别导入的类的问题,它仍然使用SWIGTYPE_而不是直接

      以上就是c/c++开发分享SWIG将生成的类从不同的模块和包导入当前类相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/562549.html

      (0)
      上一篇 2021年2月5日
      下一篇 2021年2月5日

      精彩推荐