diff --git a/app/build.gradle b/app/build.gradle index ba5a329..406e7f5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,14 +14,6 @@ android { versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - externalNativeBuild { - cmake { - cppFlags "" - } - } - ndk { - abiFilters "armeabi-v7a", "arm64-v8a" - } } buildTypes { @@ -30,12 +22,7 @@ android { proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } - externalNativeBuild { - cmake { - path "src/main/cpp/CMakeLists.txt" - version "3.10.2" - } - } + compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 diff --git a/app/src/main/cpp/CMakeLists.txt b/app/src/main/cpp/CMakeLists.txt deleted file mode 100644 index 348c5b6..0000000 --- a/app/src/main/cpp/CMakeLists.txt +++ /dev/null @@ -1,48 +0,0 @@ -# For more information about using CMake with Android Studio, read the -# documentation: https://d.android.com/studio/projects/add-native-code.html - -# Sets the minimum version of CMake required to build the native library. - -cmake_minimum_required(VERSION 3.10.2) - -# Declares and names the project. - -project("sdktestdemo") - -# Creates and names a library, sets it as either STATIC -# or SHARED, and provides the relative paths to its source code. -# You can define multiple libraries, and CMake builds them for you. -# Gradle automatically packages shared libraries with your APK. - -add_library( # Sets the name of the library. - native-lib - - # Sets the library as a shared library. - SHARED - - # Provides a relative path to your source file(s). - native-lib.cpp ) - -# Searches for a specified prebuilt library and stores the path as a -# variable. Because CMake includes system libraries in the search path by -# default, you only need to specify the name of the public NDK library -# you want to add. CMake verifies that the library exists before -# completing its build. - -find_library( # Sets the name of the path variable. - log-lib - - # Specifies the name of the NDK library that - # you want CMake to locate. - log ) - -# Specifies libraries CMake should link to your target library. You -# can link multiple libraries, such as libraries you define in this -# build script, prebuilt third-party libraries, or system libraries. - -target_link_libraries( # Specifies the target library. - native-lib - - # Links the target library to the log library - # included in the NDK. - ${log-lib} ) \ No newline at end of file diff --git a/app/src/main/cpp/native-lib.cpp b/app/src/main/cpp/native-lib.cpp deleted file mode 100644 index c9f8d4c..0000000 --- a/app/src/main/cpp/native-lib.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include <jni.h> -#include <string> - -extern "C" JNIEXPORT jstring JNICALL -Java_com_reyun_sdktestdemo_MainActivity_stringFromJNI( - JNIEnv* env, - jobject /* this */) { - std::string hello = "Hello from C++"; - return env->NewStringUTF(hello.c_str()); -} \ No newline at end of file diff --git a/app/src/main/java/com/reyun/sdktestdemo/MainActivity.java b/app/src/main/java/com/reyun/sdktestdemo/MainActivity.java index 3ddd13d..8e0e985 100644 --- a/app/src/main/java/com/reyun/sdktestdemo/MainActivity.java +++ b/app/src/main/java/com/reyun/sdktestdemo/MainActivity.java @@ -19,12 +19,11 @@ public class MainActivity extends AppCompatActivity { // Example of a call to a native method TextView tv = findViewById(R.id.sample_text); - tv.setText(stringFromJNI()); + tv.setText("hello world!"); } /** * A native method that is implemented by the 'native-lib' native library, * which is packaged with this application. */ - public native String stringFromJNI(); } \ No newline at end of file diff --git a/app/src/main/java/com/reyun/sdktestdemo/MyApplication.java b/app/src/main/java/com/reyun/sdktestdemo/MyApplication.java index 41cf743..02af9eb 100644 --- a/app/src/main/java/com/reyun/sdktestdemo/MyApplication.java +++ b/app/src/main/java/com/reyun/sdktestdemo/MyApplication.java @@ -22,7 +22,6 @@ public class MyApplication extends Application { public void onWdId(String wdId) { Log.d(TAG, "onWdId: " + wdId); } - /* @Override public void onError(String errorMsg) { diff --git a/wandun/src/main/cpp/CMakeLists.txt b/wandun/src/main/cpp/CMakeLists.txt index 07b2c3b..93961b7 100644 --- a/wandun/src/main/cpp/CMakeLists.txt +++ b/wandun/src/main/cpp/CMakeLists.txt @@ -9,18 +9,18 @@ if(${CMAKE_ANDROID_ARCH_ABI} STREQUAL "arm64-v8a") wd_syscall64.s) elseif (${CMAKE_ANDROID_ARCH_ABI} STREQUAL "armeabi-v7a") - set(ARCH_DEPENDED1_SRC + set(ARCH_DEPENDED_SRC wd_syscall32.s) endif() -set(CMAKE_CXX_FLAGS_RELEASE "-fvisibility=hidden -O3 -fno-unwind-tables") +set(CMAKE_CXX_FLAGS_RELEASE "-fvisibility=hidden -O3 -fno-unwind-tables -flto") add_library( wdun SHARED - core.cpp - wd_syscall.cpp - jni_helper.cpp + core.c + wd_syscall.c + jni_helper.c ${ARCH_DEPENDED_SRC} ) diff --git a/wandun/src/main/cpp/core.cpp b/wandun/src/main/cpp/core.c similarity index 88% rename from wandun/src/main/cpp/core.cpp rename to wandun/src/main/cpp/core.c index 9253a7c..755aacc 100644 --- a/wandun/src/main/cpp/core.cpp +++ b/wandun/src/main/cpp/core.c @@ -15,15 +15,16 @@ IMPORTWDSYSCALL #define WDMAIN_GETWDID_METHOD_SIG "()Ljava/lang/String;" jstring jni_get_wdid(JNIEnv* env, jobject thiz) { + } JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) { int pid = WDSYSCALL(SYS_getpid); JNIEnv* env = NULL; - if(vm->GetEnv((void**)&env, JNI_VERSION_1_6) == JNI_TRUE) { - jclass cls = env->FindClass(WDMAIN_CLASS_NAME); + if((*vm)->GetEnv(vm, (void**)&env, JNI_VERSION_1_6) == JNI_TRUE) { + jclass cls = (*env)->FindClass(env, WDMAIN_CLASS_NAME); JNINativeMethod methods[] = {{WDMAIN_GETWDID_METHOD_NAME, WDMAIN_GETWDID_METHOD_SIG, (void*)jni_get_wdid}}; - env->RegisterNatives(cls, methods, sizeof(methods)/sizeof(JNINativeMethod)); + (*env)->RegisterNatives(env, cls, methods, sizeof(methods)/sizeof(JNINativeMethod)); } cJSON* json = cJSON_CreateObject(); cJSON_AddStringToObject(json, "name", "zhanglei"); diff --git a/wandun/src/main/cpp/include/jni_helper.h b/wandun/src/main/cpp/include/jni_helper.h index 6162997..7e09595 100644 --- a/wandun/src/main/cpp/include/jni_helper.h +++ b/wandun/src/main/cpp/include/jni_helper.h @@ -9,14 +9,14 @@ void wdCheckException(JNIEnv* env); char wdGetMethodRetType(const char* sig); -inline char wdGetFieldType(const char* sig) { return *sig; } +char wdGetFieldType(const char* sig) { return *sig; } jvalue wdGetStaticField(JNIEnv* env, const char* clsName, const char* fieldName, const char* fieldSig); jvalue wdGetField(JNIEnv* env, jobject obj, const char* fieldName, const char* fieldSig); void wdSetStaticField(JNIEnv* env, const char* clsName, const char* fieldName, const char* fieldSig, jvalue value); void wdSetField(JNIEnv* env, jobject obj, const char* fieldName, const char* fieldSig, jvalue value); jobject wdNewObject(JNIEnv* env, const char* clsName, const char* methodSig, ...); -jvalue wdCallStaticMethod(JNIEnv* env, const char* clsName, const char* methodName, const char* methodSig, ...); -jvalue wdCallMethod(JNIEnv* env, jobject obj, const char* methodName, const char* methodSig, ...); +jvalue wdCallStaticMethod(JNIEnv* env, const char* clsName, const char* methodName, const char* methodSig, va_list args); +jvalue wdCallMethod(JNIEnv* env, jobject obj, const char* methodName, const char* methodSig, va_list args); jboolean wdCallStaticBooleanMethod(JNIEnv* env, const char* clsName, const char* methodName, const char* methodSig, ...); jbyte wdCallStaticByteMethod(JNIEnv* env, const char* clsName, const char* methodName, const char* methodSig, ...); jchar wdCallStaticCharMethod(JNIEnv* env, const char* clsName, const char* methodName, const char* methodSig, ...); diff --git a/wandun/src/main/cpp/include/wd_syscall.h b/wandun/src/main/cpp/include/wd_syscall.h index 8e36cc8..bc6bfe5 100644 --- a/wandun/src/main/cpp/include/wd_syscall.h +++ b/wandun/src/main/cpp/include/wd_syscall.h @@ -18,10 +18,10 @@ #endif #define IMPORTWDSYSCALL \ -__attribute__((visibility("hidden"))) extern "C" int wd_syscall32(int cmd, ...);\ -__attribute__((visibility("hidden"))) extern "C" int wd_syscall64(int cmd, ...); +__attribute__((visibility("hidden"))) extern int wd_syscall32(int cmd, ...);\ +__attribute__((visibility("hidden"))) extern int wd_syscall64(int cmd, ...); -extern "C" int wd_set_errno(int n); +int wd_set_errno(int n); #endif //REYUNSDK_WD_SYSCALL_H diff --git a/wandun/src/main/cpp/jni_helper.cpp b/wandun/src/main/cpp/jni_helper.c similarity index 70% rename from wandun/src/main/cpp/jni_helper.cpp rename to wandun/src/main/cpp/jni_helper.c index 934bd69..b987cc8 100644 --- a/wandun/src/main/cpp/jni_helper.cpp +++ b/wandun/src/main/cpp/jni_helper.c @@ -5,9 +5,9 @@ #include "jni_helper.h" void wdCheckException(JNIEnv* env) { - if(env->ExceptionOccurred() != nullptr){ - env->ExceptionDescribe(); - env->ExceptionClear(); + if((*env)->ExceptionOccurred(env) != NULL){ + (*env)->ExceptionDescribe(env); + (*env)->ExceptionClear(env); } } @@ -23,257 +23,257 @@ char wdGetMethodRetType(const char* sig) { } jvalue wdGetStaticField(JNIEnv* env, const char* clsName, const char* fieldName, const char* fieldSig) { - jclass cls = env->FindClass(clsName); - jfieldID fieldId = env->GetStaticFieldID(cls, fieldName, fieldSig); + jclass cls = (*env)->FindClass(env, clsName); + jfieldID fieldId = (*env)->GetStaticFieldID(env, cls, fieldName, fieldSig); jvalue value = {0}; switch(wdGetFieldType(fieldSig)) { case '[': case 'L': - value.l = env->GetStaticObjectField(cls, fieldId); + value.l = (*env)->GetStaticObjectField(env, cls, fieldId); break; case 'Z': - value.z = env->GetStaticBooleanField(cls, fieldId); + value.z = (*env)->GetStaticBooleanField(env, cls, fieldId); break; case 'B': - value.b = env->GetStaticByteField(cls, fieldId); + value.b = (*env)->GetStaticByteField(env, cls, fieldId); break; case 'C': - value.c = env->GetStaticCharField(cls, fieldId); + value.c = (*env)->GetStaticCharField(env, cls, fieldId); break; case 'S': - value.s = env->GetStaticShortField(cls, fieldId); + value.s = (*env)->GetStaticShortField(env, cls, fieldId); break; case 'I': - value.i = env->GetStaticIntField(cls, fieldId); + value.i = (*env)->GetStaticIntField(env, cls, fieldId); break; case 'J': - value.j = env->GetStaticLongField(cls, fieldId); + value.j = (*env)->GetStaticLongField(env, cls, fieldId); break; case 'F': - value.f = env->GetStaticFloatField(cls, fieldId); + value.f = (*env)->GetStaticFloatField(env, cls, fieldId); break; case 'D': - value.d = env->GetStaticDoubleField(cls, fieldId); + value.d = (*env)->GetStaticDoubleField(env, cls, fieldId); break; default: break; } wdCheckException(env); - env->DeleteLocalRef(cls); + (*env)->DeleteLocalRef(env, cls); return value; } jvalue wdGetField(JNIEnv* env, jobject obj, const char* fieldName, const char* fieldSig) { - jclass cls = env->GetObjectClass(obj); - jfieldID fieldId = env->GetFieldID(cls, fieldName, fieldSig); + jclass cls = (*env)->GetObjectClass(env, obj); + jfieldID fieldId = (*env)->GetFieldID(env, cls, fieldName, fieldSig); jvalue value = {0}; switch(wdGetFieldType(fieldSig)) { case '[': case 'L': - value.l = env->GetObjectField(cls, fieldId); + value.l = (*env)->GetObjectField(env, cls, fieldId); break; case 'Z': - value.z = env->GetBooleanField(cls, fieldId); + value.z = (*env)->GetBooleanField(env, cls, fieldId); break; case 'B': - value.b = env->GetByteField(cls, fieldId); + value.b = (*env)->GetByteField(env, cls, fieldId); break; case 'C': - value.c = env->GetCharField(cls, fieldId); + value.c = (*env)->GetCharField(env, cls, fieldId); break; case 'S': - value.s = env->GetShortField(cls, fieldId); + value.s = (*env)->GetShortField(env, cls, fieldId); break; case 'I': - value.i = env->GetIntField(cls, fieldId); + value.i = (*env)->GetIntField(env, cls, fieldId); break; case 'J': - value.j = env->GetLongField(cls, fieldId); + value.j = (*env)->GetLongField(env, cls, fieldId); break; case 'F': - value.f = env->GetFloatField(cls, fieldId); + value.f = (*env)->GetFloatField(env, cls, fieldId); break; case 'D': - value.d = env->GetDoubleField(cls, fieldId); + value.d = (*env)->GetDoubleField(env, cls, fieldId); break; default: break; } wdCheckException(env); - env->DeleteLocalRef(cls); + (*env)->DeleteLocalRef(env, cls); return value; } void wdSetStaticField(JNIEnv* env, const char* clsName, const char* fieldName, const char* fieldSig, jvalue value) { - jclass cls = env->FindClass(clsName); - jfieldID fieldId = env->GetStaticFieldID(cls, fieldName, fieldSig); + jclass cls = (*env)->FindClass(env, clsName); + jfieldID fieldId = (*env)->GetStaticFieldID(env, cls, fieldName, fieldSig); switch(wdGetFieldType(fieldSig)) { case '[': case 'L': - env->SetStaticObjectField(cls, fieldId, value.l); + (*env)->SetStaticObjectField(env, cls, fieldId, value.l); break; case 'Z': - env->SetStaticBooleanField(cls, fieldId, value.z); + (*env)->SetStaticBooleanField(env, cls, fieldId, value.z); break; case 'B': - env->SetStaticByteField(cls, fieldId, value.b); + (*env)->SetStaticByteField(env, cls, fieldId, value.b); break; case 'C': - env->SetStaticCharField(cls, fieldId, value.c); + (*env)->SetStaticCharField(env, cls, fieldId, value.c); break; case 'S': - env->SetStaticShortField(cls, fieldId, value.s); + (*env)->SetStaticShortField(env, cls, fieldId, value.s); break; case 'I': - env->SetStaticIntField(cls, fieldId, value.i); + (*env)->SetStaticIntField(env, cls, fieldId, value.i); break; case 'J': - env->SetStaticLongField(cls, fieldId, value.j); + (*env)->SetStaticLongField(env, cls, fieldId, value.j); break; case 'F': - env->SetStaticFloatField(cls, fieldId, value.f); + (*env)->SetStaticFloatField(env, cls, fieldId, value.f); break; case 'D': - env->SetStaticDoubleField(cls, fieldId, value.d); + (*env)->SetStaticDoubleField(env, cls, fieldId, value.d); break; default: break; } wdCheckException(env); - env->DeleteLocalRef(cls); + (*env)->DeleteLocalRef(env, cls); } void wdSetField(JNIEnv* env, jobject obj, const char* fieldName, const char* fieldSig, jvalue value) { - jclass cls = env->GetObjectClass(cls); - jfieldID fieldId = env->GetFieldID(cls, fieldName, fieldSig); + jclass cls = (*env)->GetObjectClass(env, cls); + jfieldID fieldId = (*env)->GetFieldID(env, cls, fieldName, fieldSig); switch(wdGetFieldType(fieldSig)) { case '[': case 'L': - env->SetObjectField(obj, fieldId, value.l); + (*env)->SetObjectField(env, obj, fieldId, value.l); break; case 'Z': - env->SetBooleanField(cls, fieldId, value.z); + (*env)->SetBooleanField(env, cls, fieldId, value.z); break; case 'B': - env->SetByteField(cls, fieldId, value.b); + (*env)->SetByteField(env, cls, fieldId, value.b); break; case 'C': - env->SetCharField(cls, fieldId, value.c); + (*env)->SetCharField(env, cls, fieldId, value.c); break; case 'S': - env->SetShortField(cls, fieldId, value.s); + (*env)->SetShortField(env, cls, fieldId, value.s); break; case 'I': - env->SetIntField(cls, fieldId, value.i); + (*env)->SetIntField(env, cls, fieldId, value.i); break; case 'J': - env->SetLongField(cls, fieldId, value.j); + (*env)->SetLongField(env, cls, fieldId, value.j); break; case 'F': - env->SetFloatField(cls, fieldId, value.f); + (*env)->SetFloatField(env, cls, fieldId, value.f); break; case 'D': - env->SetDoubleField(cls, fieldId, value.d); + (*env)->SetDoubleField(env, cls, fieldId, value.d); break; default: break; } wdCheckException(env); - env->DeleteLocalRef(cls); + (*env)->DeleteLocalRef(env, cls); } jobject wdNewObject(JNIEnv* env, const char* clsName, const char* methodSig, ...) { - jclass cls = env->FindClass(clsName); - jmethodID methodId = env->GetMethodID(cls, "<init>", methodSig); + jclass cls = (*env)->FindClass(env, clsName); + jmethodID methodId = (*env)->GetMethodID(env, cls, "<init>", methodSig); va_list args; va_start(args, methodSig); - jobject res = nullptr; - res = env->NewObjectV(cls, methodId, args); + jobject res = NULL; + res = (*env)->NewObjectV(env, cls, methodId, args); wdCheckException(env); va_end(args); - env->DeleteLocalRef(cls); + (*env)->DeleteLocalRef(env, cls); return res; } jvalue wdCallStaticMethod(JNIEnv* env, const char* clsName, const char* methodName, const char* methodSig, va_list args) { - jclass cls = env->FindClass(clsName); - jmethodID methodId = env->GetStaticMethodID(cls, methodName, methodSig); + jclass cls = (*env)->FindClass(env, clsName); + jmethodID methodId = (*env)->GetStaticMethodID(env, cls, methodName, methodSig); jvalue value = {0}; switch(wdGetMethodRetType(methodSig)) { case 'V': - env->CallStaticVoidMethodV(cls, methodId, args); + (*env)->CallStaticVoidMethodV(env, cls, methodId, args); break; case '[': case 'L': - value.l = env->CallStaticObjectMethodV (cls, methodId, args); + value.l = (*env)->CallStaticObjectMethodV (env, cls, methodId, args); break; case 'Z': - value.z = env->CallStaticBooleanMethodV(cls, methodId, args); + value.z = (*env)->CallStaticBooleanMethodV(env, cls, methodId, args); break; case 'B': - value.b = env->CallStaticByteMethodV(cls, methodId, args); + value.b = (*env)->CallStaticByteMethodV(env, cls, methodId, args); break; case 'C': - value.c = env->CallStaticCharMethodV(cls, methodId, args); + value.c = (*env)->CallStaticCharMethodV(env, cls, methodId, args); break; case 'S': - value.s = env->CallStaticShortMethodV(cls, methodId, args); + value.s = (*env)->CallStaticShortMethodV(env, cls, methodId, args); break; case 'I': - value.i = env->CallStaticIntMethodV(cls, methodId, args); + value.i = (*env)->CallStaticIntMethodV(env, cls, methodId, args); break; case 'J': - value.j = env->CallStaticLongMethodV(cls, methodId, args); + value.j = (*env)->CallStaticLongMethodV(env, cls, methodId, args); break; case 'F': - value.f = env->CallStaticFloatMethodV(cls, methodId, args); + value.f = (*env)->CallStaticFloatMethodV(env, cls, methodId, args); break; case 'D': - value.d = env->CallStaticDoubleMethodV(cls, methodId, args); + value.d = (*env)->CallStaticDoubleMethodV(env, cls, methodId, args); break; default: break; } wdCheckException(env); - env->DeleteLocalRef(cls); + (*env)->DeleteLocalRef(env, cls); return value; } jvalue wdCallMethod(JNIEnv* env, jobject obj, const char* methodName, const char* methodSig, va_list args) { - jclass cls = env->GetObjectClass(obj); - jmethodID methodId = env->GetMethodID(cls, methodName, methodSig); + jclass cls = (*env)->GetObjectClass(env, obj); + jmethodID methodId = (*env)->GetMethodID(env, cls, methodName, methodSig); jvalue value = {0}; switch(wdGetMethodRetType(methodSig)) { case 'V': - env->CallVoidMethodV(obj, methodId, args); + (*env)->CallVoidMethodV(env, obj, methodId, args); break; case '[': case 'L': - value.l = env->CallObjectMethodV (obj, methodId, args); + value.l = (*env)->CallObjectMethodV (env, obj, methodId, args); break; case 'Z': - value.z = env->CallBooleanMethodV(obj, methodId, args); + value.z = (*env)->CallBooleanMethodV(env, obj, methodId, args); break; case 'B': - value.b = env->CallByteMethodV(obj, methodId, args); + value.b = (*env)->CallByteMethodV(env, obj, methodId, args); break; case 'C': - value.c = env->CallCharMethodV(obj, methodId, args); + value.c = (*env)->CallCharMethodV(env, obj, methodId, args); break; case 'S': - value.s = env->CallShortMethodV(obj, methodId, args); + value.s = (*env)->CallShortMethodV(env, obj, methodId, args); break; case 'I': - value.i = env->CallIntMethodV(obj, methodId, args); + value.i = (*env)->CallIntMethodV(env, obj, methodId, args); break; case 'J': - value.j = env->CallLongMethodV(obj, methodId, args); + value.j = (*env)->CallLongMethodV(env, obj, methodId, args); break; case 'F': - value.f = env->CallFloatMethodV(obj, methodId, args); + value.f = (*env)->CallFloatMethodV(env, obj, methodId, args); break; case 'D': - value.d = env->CallDoubleMethodV(obj, methodId, args); + value.d = (*env)->CallDoubleMethodV(env, obj, methodId, args); break; default: break; } wdCheckException(env); - env->DeleteLocalRef(cls); + (*env)->DeleteLocalRef(env, cls); return value; } diff --git a/wandun/src/main/cpp/wd_syscall.cpp b/wandun/src/main/cpp/wd_syscall.c similarity index 100% rename from wandun/src/main/cpp/wd_syscall.cpp rename to wandun/src/main/cpp/wd_syscall.c