Size: a a a

Android NDK (C++) — русскоговорящее сообщество

2020 April 22

AT

Arkadi Tolkun in Android NDK (C++) — русскоговорящее сообщество
And fill SRCS in the way you wish
источник

MG

Matthew Good in Android NDK (C++) — русскоговорящее сообщество
;-; i still have no no libraries in my apk ;-;
источник

MG

Matthew Good in Android NDK (C++) — русскоговорящее сообщество
how do i get libavcodec.so to be included in my apk? https://github.com/mgood7123/NdkImportedLibs as i get E AndroidRuntime: java.lang.UnsatisfiedLinkError: dlopen failed: library "libavcodec.so" not found
источник

MG

Matthew Good in Android NDK (C++) — русскоговорящее сообщество
damnit
источник

MG

Matthew Good in Android NDK (C++) — русскоговорящее сообщество
why can i get it included in that project but not in my main project ;-;
источник
2020 April 23

MG

Matthew Good in Android NDK (C++) — русскоговорящее сообщество
why doesnt

       externalNativeBuild {
           cmake {
               cppFlags "-std=c++17 -DANDROID_STL=libc++_shared"
               // add ANDROID_PROJECT_ROOT variable to cmake
               arguments "-DANDROID_PROJECT_ROOT=" + rootProject.path
           }
       }
work? in CMAKE ${ANDROID_PROJECT_ROOT} is empty
источник

0

0x1de in Android NDK (C++) — русскоговорящее сообщество
Vologhat
Можно вытащить всё
Вот такой вариант написал, только проблема в том выдает не вызывающий сервис а Application, что необходимо заменить чтобы показывало именно вызывающий класс?

jobject getContext(JNIEnv *env) {
   jclass activityThreadClz = (*env)->FindClass(env, "android/app/ActivityThread");
   jmethodID currentActivityThreadMtd = (*env)->GetStaticMethodID(env,activityThreadClz,
           "currentActivityThread",
           "()Landroid/app/ActivityThread;");
   jobject activityThread = (*env)->CallStaticObjectMethod(env,activityThreadClz,
           currentActivityThreadMtd);
   jmethodID getApplicationMtd = (*env)->GetMethodID(env,activityThreadClz,
           "getApplication",
           "()Landroid/app/Application;");
   return (*env)->CallObjectMethod(env, activityThread, getApplicationMtd);
}

jstring class_name(JNIEnv *env) {
   jclass context_class = (*env)->FindClass(env,"java/lang/Class");
   jmethodID mid = (*env)->GetMethodID(env, context_class, "getClass", "()Ljava/lang/Class;");
   jobject clsObj = (*env)->CallObjectMethod(env,getContext(env), mid);
   context_class = (*env)->GetObjectClass(env,clsObj);
   mid = (*env)->GetMethodID(env, context_class, "getName", "()Ljava/lang/String;");
   jstring strObj = (jstring)(*env)->CallObjectMethod(env,clsObj, mid);

   return strObj;
}  

jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
   JNIEnv *env;
   if(((*vm)->GetEnv( vm, (void **)&env, JNI_VERSION_1_6 ))!= JNI_OK)return -1;
   jstring package_name = class_name(env);
   char *str = (*env)->GetStringUTFChars(env,package_name, NULL);
   LOGI("class->%s", str);
   (*env)->ReleaseStringUTFChars(env,package_name, str);
}
источник

V

Vologhat in Android NDK (C++) — русскоговорящее сообщество
0x1de
Вот такой вариант написал, только проблема в том выдает не вызывающий сервис а Application, что необходимо заменить чтобы показывало именно вызывающий класс?

jobject getContext(JNIEnv *env) {
   jclass activityThreadClz = (*env)->FindClass(env, "android/app/ActivityThread");
   jmethodID currentActivityThreadMtd = (*env)->GetStaticMethodID(env,activityThreadClz,
           "currentActivityThread",
           "()Landroid/app/ActivityThread;");
   jobject activityThread = (*env)->CallStaticObjectMethod(env,activityThreadClz,
           currentActivityThreadMtd);
   jmethodID getApplicationMtd = (*env)->GetMethodID(env,activityThreadClz,
           "getApplication",
           "()Landroid/app/Application;");
   return (*env)->CallObjectMethod(env, activityThread, getApplicationMtd);
}

jstring class_name(JNIEnv *env) {
   jclass context_class = (*env)->FindClass(env,"java/lang/Class");
   jmethodID mid = (*env)->GetMethodID(env, context_class, "getClass", "()Ljava/lang/Class;");
   jobject clsObj = (*env)->CallObjectMethod(env,getContext(env), mid);
   context_class = (*env)->GetObjectClass(env,clsObj);
   mid = (*env)->GetMethodID(env, context_class, "getName", "()Ljava/lang/String;");
   jstring strObj = (jstring)(*env)->CallObjectMethod(env,clsObj, mid);

   return strObj;
}  

jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
   JNIEnv *env;
   if(((*vm)->GetEnv( vm, (void **)&env, JNI_VERSION_1_6 ))!= JNI_OK)return -1;
   jstring package_name = class_name(env);
   char *str = (*env)->GetStringUTFChars(env,package_name, NULL);
   LOGI("class->%s", str);
   (*env)->ReleaseStringUTFChars(env,package_name, str);
}
Так эм....
источник

V

Vologhat in Android NDK (C++) — русскоговорящее сообщество
Ты вызываешь же класс контекста 🌚
источник

V

Vologhat in Android NDK (C++) — русскоговорящее сообщество
И ты его нифига не вызываешь
источник

0

0x1de in Android NDK (C++) — русскоговорящее сообщество
Vologhat
И ты его нифига не вызываешь
jobject clsObj = (*env)->CallObjectMethod(env,getContext(env), mid);

Вроде вот тут передаю контекст. Что поменять нужно в коде?
источник

V

Vologhat in Android NDK (C++) — русскоговорящее сообщество
0x1de
jobject clsObj = (*env)->CallObjectMethod(env,getContext(env), mid);

Вроде вот тут передаю контекст. Что поменять нужно в коде?
Что ты хочешь чтобы оно тебе показало?
источник

0

0x1de in Android NDK (C++) — русскоговорящее сообщество
Vologhat
Что ты хочешь чтобы оно тебе показало?
Вообще у меня в MainService грузится либа. Мне нужно динамически зарегистрировать методы, но для этого необходимо передать путь до этого класса. Сейчас у меня статический путь, частично динамическая регистрация работает с ним, я хочу этот путь получать динамически, чтобы в случае когда буду цеплять либу к другому классу или пакету не нужно было каждый раз переписывать и  собирать её заново
источник

0

0x1de in Android NDK (C++) — русскоговорящее сообщество
Т.е мне нужно получить в Си вызывающий класс явы
источник

V

Vologhat in Android NDK (C++) — русскоговорящее сообщество
0x1de
Вообще у меня в MainService грузится либа. Мне нужно динамически зарегистрировать методы, но для этого необходимо передать путь до этого класса. Сейчас у меня статический путь, частично динамическая регистрация работает с ним, я хочу этот путь получать динамически, чтобы в случае когда буду цеплять либу к другому классу или пакету не нужно было каждый раз переписывать и  собирать её заново
То есть надо получить имя класса который грузит либу?
источник

0

0x1de in Android NDK (C++) — русскоговорящее сообщество
Да верно
источник

V

Vologhat in Android NDK (C++) — русскоговорящее сообщество
0x1de
Да верно
Так сделай например в этом классе нативный метод
источник

V

Vologhat in Android NDK (C++) — русскоговорящее сообщество
А уже из него возвращайся имя класса
источник

0

0x1de in Android NDK (C++) — русскоговорящее сообщество
Есть такой. Только тут немного вопрос курицы и яйца
источник

0

0x1de in Android NDK (C++) — русскоговорящее сообщество
Смотри чтобы зарегистрировать registerNatives мне нужно скормить имя класса
источник