SWIG内存管理

 每个由SWIG产生的代理类,拥有一个所属标记(swigCMeOwn).这个标记指定该有谁清理这个优先的C/C++组件。如果代理类有这个组件,这个内存将会得到释放通过finalize方法,当它被当做垃圾回收。仅仅通过触发delete函数没有等待垃圾回收下内存得到释放。在运行期间这个Java类能够被指导来释放或获得C/C++组件的ownership通过swigReleaseOwnerShip和swigTakeOwnership函数。

  本地代码调用Java

 直到这,已经知道了从Java到C/C++代码。在这些情况下,你可能需要从C/C++代码返回到Java代码,例如回调。SWIG并提供支持从C/C++代码到Java通过虚函数。

  匿名的通信:

为了展示这个过程,你将转化这个getuid函数调用到一个匿名的模式通过封装它在一个C/C++类中和返回它的结果通过一个回调。对于这个例子,放在类的定义和指定在.i的接口文件,如下:

%module Unix
. . .
%{
/* Asynchornous user ID provider. */
class AsyncUidProvider {
public:
AsyncUidProvider() {
}
virtual ~ AsyncUidProvider() {
}
void get() {
onUid(getuid());
}
virtual void onUid(uid_t uid) {
}
public:
AsyncUidProvider();
virtual ~ AsyncUidProvider();
void get();
virtual void onUid(uid_t uid);
};

允许的指挥:

SWIG提供对于交叉语言polymorphism的支持。这个directors功能默认关闭。为了开启它,这%module预处理应该被修改包含directors标记。在开启了directors扩展后,这个功能应用在AsynUidProvider类使用%feature预处理指令。所有的改变如下:

/* Module name is Unix. */
%module(directors = 1) Unix
/* Enable directors for AsyncUidProvider. */
%feature("director") AsyncUidProvider;

开启RTTi

默认情况下,RTTI被Android NDK建立系统关闭。为了使用它,修改Android.mk文件,如下:

# Enable RTTI
LOCAL_CPP_FEATURES + = rtti

覆盖这个回调函数

在Java一边,你需要扩展这暴露的AsyncUidProvider类和覆盖着onUid方法来接收getuid函数调用的结果,如下:

package com.example.hellojni;
import android.widget.TextView;
import com.apress.swig.AsyncUidProvider;
public class UidHandler extends AsyncUidProvider {
private final TextView textView;
UidHandler(TextView textView) {
this.textView = textView;
}
@Override
public void onUid(long uid) {
textView.setText("UID: " + uid);
}
}

更新项目:

@Override
public void onCreate(Bundle savedInstanceState)
{
. . .
TextView tv = new TextView(this);
setContentView(tv);
UidHandler uidHandler = new UidHandler(tv);
uidHandler.get();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值