Skip to content

Commit ce2de6a

Browse files
author
Mihail Slavchev
committed
Add support to implement Java interfaces via extend keyword (issue #514
1 parent 2be0940 commit ce2de6a

4 files changed

Lines changed: 19 additions & 4 deletions

File tree

runtime/src/main/jni/CallbackHandlers.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,9 +155,9 @@ jclass CallbackHandlers::ResolveClass(Isolate *isolate, const string& fullClassn
155155
}
156156

157157
// Called by ExtendCallMethodCallback when extending a class
158-
string CallbackHandlers::ResolveClassName(Isolate *isolate, const string& fullClassname, const Local<Object>& implementationObject)
158+
string CallbackHandlers::ResolveClassName(Isolate *isolate, const string& fullClassname, const Local<Object>& implementationObject, bool isInterface)
159159
{
160-
auto clazz = ResolveClass(isolate, fullClassname, implementationObject, false);
160+
auto clazz = ResolveClass(isolate, fullClassname, implementationObject, isInterface);
161161
auto runtime = Runtime::GetRuntime(isolate);
162162
auto objectManager = runtime->GetObjectManager();
163163
auto className = objectManager->GetClassName(clazz);

runtime/src/main/jni/CallbackHandlers.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ namespace tns
3232

3333
static jclass ResolveClass(v8::Isolate *isolate, const std::string& fullClassname, const v8::Local<v8::Object>& implementationObject, bool isInterface);
3434

35-
static std::string ResolveClassName(v8::Isolate *isolate, const std::string& fullClassname, const v8::Local<v8::Object>& implementationObject);
35+
static std::string ResolveClassName(v8::Isolate *isolate, const std::string& fullClassname, const v8::Local<v8::Object>& implementationObject, bool isInterface);
3636

3737
static v8::Local<v8::Value> GetArrayElement(v8::Isolate *isolate, const v8::Local<v8::Object>& array, uint32_t index, const std::string& arraySignature);
3838

runtime/src/main/jni/MetadataNode.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1502,7 +1502,9 @@ void MetadataNode::ExtendCallMethodCallback(const v8::FunctionCallbackInfo<v8::V
15021502
auto isolate = info.GetIsolate();
15031503

15041504
//resolve class (pre-generated or generated runtime from dex generator)
1505-
auto fullExtendedName = CallbackHandlers::ResolveClassName(isolate, fullClassName, implementationObject);
1505+
uint8_t nodeType = s_metadataReader.GetNodeType(node->m_treeNode);
1506+
bool isInterface = s_metadataReader.IsNodeTypeInterface(nodeType);
1507+
auto fullExtendedName = CallbackHandlers::ResolveClassName(isolate, fullClassName, implementationObject, isInterface);
15061508
DEBUG_WRITE("ExtendsCallMethodHandler: extend full name %s", fullClassName.c_str());
15071509

15081510
auto cachedData = GetCachedExtendedClassData(isolate, fullExtendedName);

test-app/app/src/main/assets/app/tests/tests.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1687,4 +1687,17 @@ describe("Tests ", function () {
16871687

16881688
expect(exceptionCaught).toBe(true);
16891689
});
1690+
1691+
it("should implement an interface using extend keyword", function () {
1692+
var called = false;
1693+
var R = java.lang.Runnable.extend({
1694+
run: function() {
1695+
called = true;
1696+
}
1697+
});
1698+
1699+
new R().run();
1700+
1701+
expect(called).toBe(true);
1702+
});
16901703
});

0 commit comments

Comments
 (0)