diff --git a/README.md b/README.md index 955012e9fd..b513f6821e 100644 --- a/README.md +++ b/README.md @@ -357,36 +357,74 @@ the following, starting from the Avian directory: cd .. mkdir -p android/system android/external cd android + git clone https://android.googlesource.com/platform/bionic + (cd bionic && \ + git checkout 84983592ade3ec7d72d082262fb6646849979bfc) + git clone https://android.googlesource.com/platform/system/core \ system/core - git clone https://android.googlesource.com/platform/external/expat \ - external/expat + (cd system/core && \ + git checkout fafcabd0dd4432de3c7f5956edec23f6ed241b56) + git clone https://android.googlesource.com/platform/external/fdlibm \ external/fdlibm + (cd external/fdlibm && \ + git checkout 0da5f683c9ddc9442af3b389b4220e91ccffb320) + git clone https://android.googlesource.com/platform/external/icu4c \ external/icu4c + (cd external/icu4c && \ + git checkout 8fd45e08f1054d80a356ef8aa05659a2ba84707c) + git clone https://android.googlesource.com/platform/libnativehelper + (cd libnativehelper && \ + git checkout cf5ac0ec696fce7fac6b324ec7d4d6da217e501c) + git clone https://android.googlesource.com/platform/external/openssl \ external/openssl + (cd external/openssl && \ + git checkout 7b972f1aa23172c4430ada7f3236fa1fd9b31756) + git clone https://android.googlesource.com/platform/external/zlib \ external/zlib + (cd external/zlib && \ + git checkout 15b6223aa57a347ce113729253802cb2fdeb4ad0) + git clone git://git.openssl.org/openssl.git openssl-upstream + (cd openssl-upstream && \ + git checkout OpenSSL_1_0_1e) + git clone https://github.com/dicej/android-libcore64 libcore + + curl -Of http://readytalk.github.io/avian/expat-2.1.0.tar.gz + (cd external && tar xzf ../expat-2.1.0.tar.gz && mv expat-2.1.0 expat) + (cd external/expat && CFLAGS=-fPIC CXXFLAGS=-fPIC ./configure \ --enable-static && make) + (cd external/fdlibm && (mv makefile.in Makefile.in || true) \ && CFLAGS=-fPIC bash configure && make) + (cd external/icu4c && CFLAGS=-fPIC CXXFLAGS=-fPIC ./configure \ --enable-static && make) NB: use 'CC="gcc -fPIC" ./Configure darwin64-x86_64-cc' when building for x86_64 OS X instead of 'CC="gcc -fPIC" ./config': - (cd openssl-upstream && git checkout OpenSSL_1_0_1e \ - && (for x in ../external/openssl/patches/*.patch; \ - do patch -p1 < $x; done) \ + (cd openssl-upstream \ + && (for x in \ + progs \ + handshake_cutthrough \ + jsse \ + channelid \ + eng_dyn_dirs \ + fix_clang_build \ + tls12_digests \ + alpn; \ + do patch -p1 < ../external/openssl/patches/$x.patch; done) \ && CC="gcc -fPIC" ./config && make) + cd ../avian make android=$(pwd)/../android test @@ -403,6 +441,10 @@ against OpenSSL 1.0.1e, so that's the tag we check out, but this may change in the future when the Android fork rebases against a new OpenSSL version. +Finally, we specify specific commit hashes for each repository which +are known to work. Later versions may also work, but have not been +tested. + Installing ---------- diff --git a/makefile b/makefile index d2184dad25..736ec89308 100755 --- a/makefile +++ b/makefile @@ -168,10 +168,19 @@ ifneq ($(android),) -I$(build)/android-src \ -fno-exceptions \ -D_FILE_OFFSET_BITS=64 \ + -DOS_SHARED_LIB_FORMAT_STR="\"$(so-prefix)%s$(so-suffix)\"" \ + -DJNI_JARJAR_PREFIX= \ -g3 \ -Werror - luni-cpps := $(shell find $(luni-native) -name '*.cpp') + luni-cpps := $(shell find $(luni-native) -name '*.cpp') + + libnativehelper-native := $(android)/libnativehelper + libnativehelper-cpps := $(libnativehelper-native)/JniConstants.cpp \ + $(libnativehelper-native)/toStringArray.cpp + + crypto-native := $(android)/libcore/crypto/src/main/native + crypto-cpps := $(crypto-native)/org_conscrypt_NativeCrypto.cpp ifeq ($(platform),windows) android-cflags += -D__STDC_CONSTANT_MACROS @@ -206,18 +215,27 @@ ifneq ($(android),) $(android)/openssl-upstream/libssl.a \ $(android)/openssl-upstream/libcrypto.a \ $(platform-lflags) \ + -lrt \ -lstdc++ classpath-objects = \ - $(call cpp-objects,$(luni-cpps),$(luni-native),$(build)) + $(call cpp-objects,$(luni-cpps),$(luni-native),$(build)) \ + $(call cpp-objects,$(crypto-cpps),$(crypto-native),$(build)) \ + $(call cpp-objects,$(libnativehelper-cpps),$(libnativehelper-native),$(build)) luni-java = $(android)/libcore/luni/src/main/java luni-javas := $(shell find $(luni-java) -name '*.java') + libdvm-java = $(android)/libcore/libdvm/src/main/java + libdvm-javas := $(shell find $(libdvm-java) -name '*.java') + crypto-java = $(android)/libcore/crypto/src/main/java + crypto-javas := $(shell find $(crypto-java) -name '*.java') dalvik-java = $(android)/libcore/dalvik/src/main/java dalvik-javas := $(shell find $(dalvik-java) -name '*.java') xml-java = $(android)/libcore/xml/src/main/java xml-javas := $(shell find $(xml-java) -name '*.java') android-classes = \ $(call java-classes,$(luni-javas),$(luni-java),$(build)/android) \ + $(call java-classes,$(libdvm-javas),$(libdvm-java),$(build)/android) \ + $(call java-classes,$(crypto-javas),$(crypto-java),$(build)/android) \ $(call java-classes,$(dalvik-javas),$(dalvik-java),$(build)/android) \ $(call java-classes,$(xml-javas),$(xml-java),$(build)/android) classpath = android @@ -1466,13 +1484,20 @@ $(classpath-dep): $(classpath-sources) $(classpath-jar-dep) $(build)/android-src/%.cpp: $(luni-native)/%.cpp cp $(<) $(@) +$(build)/android-src/%.cpp: $(libnativehelper-native)/%.cpp + cp $(<) $(@) + +$(build)/android-src/%.cpp: $(crypto-native)/%.cpp + cp $(<) $(@) + $(build)/%.o: $(build)/android-src/%.cpp $(build)/android.dep @echo "compiling $(@)" @mkdir -p $(dir $(@)) $(cxx) $(android-cflags) $(classpath-extra-cflags) -c \ $$($(windows-path) $(<)) $(call output,$(@)) -$(build)/android.dep: $(luni-javas) $(dalvik-javas) $(xml-javas) +$(build)/android.dep: $(luni-javas) $(libdvm-javas) $(crypto-javas) \ + $(dalvik-javas) $(xml-javas) @echo "compiling luni classes" @mkdir -p $(classpath-build) @mkdir -p $(build)/android @@ -1480,7 +1505,8 @@ $(build)/android.dep: $(luni-javas) $(dalvik-javas) $(xml-javas) @mkdir -p $(build)/android-src/libexpat cp $(android)/external/fdlibm/fdlibm.h $(build)/android-src/external/fdlibm/ cp $(android)/external/expat/lib/expat*.h $(build)/android-src/libexpat/ - cp -a $(luni-java)/* $(dalvik-java)/* $(xml-java)/* $(build)/android-src/ + cp -a $(luni-java)/* $(libdvm-java)/* $(crypto-java)/* $(dalvik-java)/* \ + $(xml-java)/* $(build)/android-src/ sed -i -e 's/return ordinal - o.ordinal;/return ordinal - o.ordinal();/' \ $(build)/android-src/java/lang/Enum.java find $(build)/android-src -name '*.java' > $(build)/android.txt diff --git a/src/android/stubs.cpp b/src/android/stubs.cpp index 157bdc0ad7..5d94b17292 100644 --- a/src/android/stubs.cpp +++ b/src/android/stubs.cpp @@ -4,3 +4,15 @@ extern "C" int JNI_OnLoad(JavaVM*, void*) { return 0; } + +struct _JNIEnv; + +struct JniConstants { + static void init(_JNIEnv* env); +}; + +void +JniConstants::init(_JNIEnv*) +{ + // ignore +} diff --git a/src/classpath-android.cpp b/src/classpath-android.cpp index fcc8b2b8ff..e669125500 100644 --- a/src/classpath-android.cpp +++ b/src/classpath-android.cpp @@ -9,6 +9,11 @@ details. */ struct JavaVM; +struct _JNIEnv; + +struct JniConstants { + static void init(_JNIEnv* env); +}; extern "C" int JNI_OnLoad(JavaVM*, void*); @@ -20,6 +25,10 @@ extern "C" int JNI_OnLoad(JavaVM*, void*); using namespace vm; +extern "C" JNIEXPORT int64_t JNICALL +Avian_avian_Classes_defineVMClass +(Thread*, object, uintptr_t*); + namespace { namespace local { @@ -60,6 +69,22 @@ appLoader(Thread* t, object, uintptr_t*) return reinterpret_cast(root(t, Machine::AppLoader)); } +int64_t JNICALL +defineClass(Thread* t, object method, uintptr_t* arguments) +{ + uintptr_t args[] + = { arguments[0], arguments[2], arguments[3], arguments[4] }; + + int64_t v = Avian_avian_Classes_defineVMClass(t, method, args); + + if (v) { + return reinterpret_cast + (getJClass(t, reinterpret_cast(v))); + } else { + return 0; + } +} + int64_t JNICALL mapData(Thread*, object, uintptr_t*); @@ -383,6 +408,10 @@ class MyClasspath : public Classpath { intercept(t, c, "createSystemClassLoader", "()Ljava/lang/ClassLoader;", voidPointer(appLoader), updateRuntimeData); + + intercept(t, c, "defineClass", + "(Ljava/lang/String;[BII)Ljava/lang/Class;", + voidPointer(defineClass), updateRuntimeData); } } @@ -429,6 +458,8 @@ class MyClasspath : public Classpath { interceptMethods(t, true); + JniConstants::init(reinterpret_cast<_JNIEnv*>(t)); + JNI_OnLoad(reinterpret_cast< ::JavaVM*>(t->m), 0); } @@ -714,8 +745,6 @@ jniCreateFileDescriptor(JNIEnv* e, int fd) return descriptor; } -struct _JNIEnv; - int register_org_apache_harmony_dalvik_NativeTestTarget(_JNIEnv*) { @@ -949,10 +978,6 @@ Avian_java_lang_VMClassLoader_findLoadedClass } } -extern "C" JNIEXPORT int64_t JNICALL -Avian_avian_Classes_defineVMClass -(Thread*, object, uintptr_t*); - extern "C" JNIEXPORT int64_t JNICALL Avian_java_lang_VMClassLoader_defineClass__Ljava_lang_ClassLoader_2Ljava_lang_String_2_3BII (Thread* t, object method, uintptr_t* arguments)