你可能想要做的:
%apply jobject { void* };
因爲申請%複印件上一個C++到另一種C++類型定義的typemaps。 Object
是一種Java類型,不是C++類型,因此沒有任何類型映射可以被複制。另一方面,jobject
是JNI等價物。
此外假設你想擁有「正常」 GC語義(即不要求保留您通過任何數據),你需要做更多的工作,例如:
%module test
%{
#include "test.hh"
%}
%apply jobject { void * };
%typemap(in) void * {
void *old = getData();
if (old) JCALL1(DeleteGlobalRef, jenv, (jobject)old);
$1 = JCALL1(NewGlobalRef, jenv, $input);
}
%typemap(out) void * {
$result = (jobject)($1);
}
%include "test.hh"
這使得爲您的數據提供一個新的全球參考資料,這可能是阻止GC從中解放出來的唯一因素。
給出一個頭文件:
void setData(void *);
void *getData();
和實施:
#include "test.hh"
namespace {
void *d = nullptr;
}
void setData(void *d) {
::d = d;
}
void *getData() {
return d;
}
足以讓:
public class run {
public static void main(String[] argv) {
System.loadLibrary("test");
Object example = "HELLO";
test.setData(example);
System.out.println(test.getData());
}
}
才能正常工作。
正如所寫,這些類型圖非常難看 - 它們會影響全部的使用void *
。所以如果你真的使用過這個,你會想第二次使用%apply
或%clear
來限制它們的影響。您也可以在頭文件中命名參數並使用該參數來限制類型映射的應用位置。
我想我們還需要以某種方式建立一個全球參考,如果我們希望這實際上是一些有用的工作? – 2014-10-01 04:33:12
@SamuelAudet只要'SetUserData'健全就可以工作。 – Flexo 2014-10-01 10:44:24
@SamuelAudet意識到你在得到什麼,他們沒有辦法讓'env',所以我補充了缺少的細節。 – Flexo 2014-10-01 12:21:02