From 539e09e4a5228f7d74247e5dc2372436ed7e9f97 Mon Sep 17 00:00:00 2001 From: Regis Cosnier Date: Fri, 15 Mar 2019 20:42:54 +0100 Subject: [PATCH] - Cleanup the code - Allow to build with the command line --- ReadMe.txt | 37 +++++++++++++++++++-- app/build.gradle | 46 ++++++++++++++++++++++++++ app/src/main/cpp/emu48-jni.c | 8 +---- app/src/main/cpp/win32-layer.c | 59 ++++------------------------------ app/src/main/cpp/win32-layer.h | 2 +- gradle.properties | 2 -- 6 files changed, 89 insertions(+), 65 deletions(-) diff --git a/ReadMe.txt b/ReadMe.txt index 075307f..6db420c 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -23,7 +23,7 @@ QUICK START NOTES -- When using a custom KML script by selecting a folder, you must take care of the case sensitivity of its dependencies. +- When using a custom KML script by selecting a folder, you must take care of the case sensitivity of its dependency files. NOT WORKING YET @@ -86,8 +86,10 @@ You should have received a copy of the GNU General Public License along with thi Note: some included files are not covered by the GPL; these include ROM image files (copyrighted by HP), KML files and faceplate images (copyrighted by their authors). The Eric's Real scripts ("real*.kml" and "real*.bmp") are embedded in this application with the kind permission of Eric Rechlin. + TODO -- Sometimes, it seems in authentic calculator slow speed and it should not be. + +- Sometimes, it seems to be in authentic calculator slow speed and it should not be. - Add a separation between the pixels (Suggestion from Jaime Meza) - Sometimes the "busy" annunciator gets stuck - Add KML script loading dependencies fallback to the inner ROM (and may be KML include?) @@ -95,3 +97,34 @@ TODO - Add a true fullscreen mode under the status bar and the bottom buttons - Improve the access to the menu - Change the logo following the template + + +BUILD + +Emu48 for Android is built with Android Studio 3.3 (2019). +And to generate a installable APK file with a real Android device, it MUST be signed. + +Either use Android Studio: +* In menu "Build" +* Select "Generate Signed Bundle / APK..." +* Select "APK", then "Next" +* "Create new..." (or use an existing key store file) +* Enter "Key store password", "Key alias" and "Key password", then "Next" +* Select a "Destination folder:" +* Select the "Build Variants:" "release" +* Select the "Signature Versions:" "V1" (V1 only) +* Finish + +Or in the command line, build the signed APK: +* In the root folder, create a keystore.jks file with: +** keytool -genkey -keystore ./keystore.jks -keyalg RSA -validity 9125 -alias key0 +** keytool -genkeypair -v -keystore ./keystore.jks -keyalg RSA -validity 9125 -alias key0 +* create the file ./keystore.properties , with the following properties: + storeFile=../keystore.jks + storePassword=myPassword + keyAlias=key0 + keyPassword=myPassword +* gradlew build +* The APK should be in the folder app/build/outputs/apk/release + +Then, you should be able to use this fresh APK file with an Android device. diff --git a/app/build.gradle b/app/build.gradle index bdb8299..31b7042 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,5 +1,32 @@ apply plugin: 'com.android.application' +// Create a variable called keystorePropertiesFile, and initialize it to your +// keystore.properties file, in the rootProject folder. +def keystorePropertiesFile = rootProject.file("keystore.properties") +def keystoreProperties = new Properties() +def canSign = false +if(keystorePropertiesFile.exists()) { + canSign = true + println("The release flavor will signed in app/build/outputs/apk/release/app-release.apk") + + // Load your keystore.properties file into the keystoreProperties object. + keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) +} else { + println(""" + The keystore.properties file is not found, so, you will not be able to install an unsigned APK in an Android device. + Please, in the root folder, create a keystore.jks file with the command: + + keytool -genkey -keystore ./keystore.jks -keyalg RSA -validity 9125 -alias key0 + + and create the file ./keystore.properties , with the following properties: + + storeFile=../keystore.jks + storePassword=myPassword + keyAlias=key0 + keyPassword=myPassword + """) +} + android { compileSdkVersion 28 defaultConfig { @@ -17,10 +44,29 @@ android { } } } +// if(project.hasProperty("MyProject.properties") +// && new File(project.property("MyProject.properties")).exists()) { + + if(canSign) { + signingConfigs { + release { +// storeFile new File(keystoreProperties['storeFile']) + storeFile file(keystoreProperties['storeFile']) + storePassword keystoreProperties['storePassword'] + keyAlias keystoreProperties['keyAlias'] + keyPassword keystoreProperties['keyPassword'] + v1SigningEnabled true + v2SigningEnabled false + } + } + } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + if(canSign) { + signingConfig signingConfigs.release + } } } externalNativeBuild { diff --git a/app/src/main/cpp/emu48-jni.c b/app/src/main/cpp/emu48-jni.c index 2fbec17..bcffee8 100644 --- a/app/src/main/cpp/emu48-jni.c +++ b/app/src/main/cpp/emu48-jni.c @@ -37,12 +37,6 @@ extern void buttonUp(int x, int y); extern void keyDown(int virtKey); extern void keyUp(int virtKey); -extern void OnBackupSave(); -extern void OnBackupRestore(); -extern void OnBackupDelete(); - - -//JNIEnv *getJNIEnvironment(); JavaVM *java_machine; JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) { @@ -283,7 +277,7 @@ JNIEXPORT void JNICALL Java_org_emulator_forty_eight_NativeLib_start(JNIEnv *env // read emulator settings GetCurrentDirectory(ARRAYSIZEOF(szCurrentDirectory),szCurrentDirectory); - ReadSettings(); + //ReadSettings(); _tcscpy(szCurrentDirectory, ""); _tcscpy(szEmuDirectory, "assets/calculators/"); diff --git a/app/src/main/cpp/win32-layer.c b/app/src/main/cpp/win32-layer.c index 5237dd8..d92a9a5 100644 --- a/app/src/main/cpp/win32-layer.c +++ b/app/src/main/cpp/win32-layer.c @@ -24,7 +24,6 @@ size_t assetsPrefixLength; const TCHAR * contentScheme = _T("content://"); size_t contentSchemeLength; const TCHAR * documentScheme = _T("document:"); -//static HDC mainPaintDC = NULL; struct timerEvent { BOOL valid; int timerId; @@ -208,7 +207,7 @@ HANDLE CreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, return handle; } } - return INVALID_HANDLE_VALUE; + return (HANDLE) INVALID_HANDLE_VALUE; } BOOL ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped) { @@ -338,27 +337,7 @@ BOOL UnmapViewOfFile(LPCVOID lpBaseAddress) { for (int i = 0; i < MAX_FILE_MAPPING_HANDLE; ++i) { HANDLE fileMappingHandle = fileMappingHandles[i]; if(fileMappingHandle && lpBaseAddress == fileMappingHandle->fileMappingAddress) { -// Only save the file manually (for Port2 actually) -// if(fileMappingHandle->fileMappingProtect == PAGE_READWRITE) { -// if(fileMappingHandle->handleType == HANDLE_TYPE_FILE_MAPPING) { -// // munmap does not seem to work, so: -// size_t numberOfBytesToWrite = fileMappingHandle->fileMappingSize - fileMappingHandle->fileMappingOffset; -// off_t currentPosition = lseek(fileMappingHandle->fileDescriptor, 0, SEEK_CUR); -// lseek(fileMappingHandle->fileDescriptor, fileMappingHandle->fileMappingOffset, SEEK_SET); -// write(fileMappingHandle->fileDescriptor, fileMappingHandle->fileMappingAddress, numberOfBytesToWrite); -// lseek(fileMappingHandle->fileDescriptor, currentPosition, SEEK_SET); -// result = munmap(lpBaseAddress, fileMappingHandle->fileMappingSize); -// } else if(fileMappingHandle->handleType == HANDLE_TYPE_FILE_MAPPING_CONTENT) { -// size_t numberOfBytesToWrite = fileMappingHandle->fileMappingSize - fileMappingHandle->fileMappingOffset; -// off_t currentPosition = lseek(fileMappingHandle->fileDescriptor, 0, SEEK_CUR); -// lseek(fileMappingHandle->fileDescriptor, fileMappingHandle->fileMappingOffset, SEEK_SET); -// write(fileMappingHandle->fileDescriptor, fileMappingHandle->fileMappingAddress, numberOfBytesToWrite); -// lseek(fileMappingHandle->fileDescriptor, currentPosition, SEEK_SET); -// } else if(fileMappingHandle->handleType == HANDLE_TYPE_FILE_MAPPING_ASSET) { -// // No need to unmap -// result = 0; -// } -// } + // Only save the file manually (for Port2 actually) fileMappingHandles[i] = NULL; break; } @@ -761,21 +740,6 @@ BOOL WritePrivateProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpS return 0; } -/* -void SetTimer(void *, TimerType id, int msec, void *) -{ - switch(id) { - case TIME_SHOW: - doc_manager->getCurrent()->SetShowTimer(msec); - break; - case TIME_NEXT: - doc_manager->getCurrent()->SetNextTimer(msec); - break; - } -} -*/ - - HGLOBAL WINAPI GlobalAlloc(UINT uFlags, SIZE_T dwBytes) { return malloc(dwBytes); } @@ -876,14 +840,6 @@ MMRESULT waveOutOpen(LPHWAVEOUT phwo, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWOR handle->pwfx = (WAVEFORMATEX *) pwfx; handle->uDeviceID = uDeviceID; - - //SLObjectItf engineObject = NULL; - //SLObjectItf outputMixObject = NULL; - //SLObjectItf bqPlayerObject = NULL; - //pthread_mutex_t audioEngineLock = PTHREAD_MUTEX_INITIALIZER; - //handle->audioEngineLock = PTHREAD_MUTEX_INITIALIZER; - - SLresult result; // create engine @@ -1674,17 +1630,14 @@ BOOL GdiFlush(void) { return 0; } HDC BeginPaint(HWND hWnd, LPPAINTSTRUCT lpPaint) { - //hWindowDC; -// if(!mainPaintDC) -// mainPaintDC = CreateCompatibleDC(NULL); if(lpPaint) { memset(lpPaint, 0, sizeof(PAINTSTRUCT)); lpPaint->fErase = TRUE; - lpPaint->hdc = hWindowDC; //mainPaintDC; - lpPaint->rcPaint.right = (short) nBackgroundW; //androidBitmapInfo.width; // - 1; - lpPaint->rcPaint.bottom = (short) nBackgroundH; //androidBitmapInfo.height; // - 1; + lpPaint->hdc = hWindowDC; + lpPaint->rcPaint.right = (short) nBackgroundW; + lpPaint->rcPaint.bottom = (short) nBackgroundH; } - return hWindowDC; //mainPaintDC; + return hWindowDC; } BOOL EndPaint(HWND hWnd, CONST PAINTSTRUCT *lpPaint) { mainViewUpdateCallback(); diff --git a/app/src/main/cpp/win32-layer.h b/app/src/main/cpp/win32-layer.h index 12628fb..c4c4f8f 100644 --- a/app/src/main/cpp/win32-layer.h +++ b/app/src/main/cpp/win32-layer.h @@ -225,7 +225,7 @@ enum FILE_MAP_COPY, //errors - INVALID_HANDLE_VALUE = -1, + INVALID_HANDLE_VALUE = -1, ERROR_ALREADY_EXISTS = 1 }; diff --git a/gradle.properties b/gradle.properties index 461e8f6..06966a0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,5 +13,3 @@ org.gradle.jvmargs=-Xmx1536m # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true - -