将 class 注入 android jni 中的 JNIEnv
Injecting class into the JNIEnv in android jni
C++代码:
extern "C" JNIEXPORT void JNICALL
Java_com_example_afl_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
// env->DefineClass(...)
}
我正在从 Java 端代码调用上述函数:
public class MainActivity extends AppCompatActivity {
static {
System.loadLibrary("native-lib");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
stringFromJNI(); // call cpp function
}
public native String stringFromJNI();
}
我的问题是关于cpp代码中的env->DefineClass(...)
。
如您所见,android VM 将 JNIEnv *env
传递给我的本机函数,因此通过使用 env
指针,我可以访问我所有的 java classes 和我可以使用它们(我可以访问我的所有 java 端 classes 并且我可以创建实例对象并执行所有操作)。
但是如何访问另一个 apk 中的 class 并且它在另一个包名称中?
我想反编译目标 apk 并复制 class 并使用 env->DefineClass
函数将 class 注入我的 env
但我不知道如何完成此任务。
感谢您的回复:)
不可能。 Android does not implement DefineClass
:
All JNI 1.6 features are supported, with the following exception:
DefineClass is not implemented. Android does not use Java bytecodes or class files, so passing in binary class data doesn't work.
即使 有效,您应用的用户很可能没有访问其他应用程序 .apk 的权限。
C++代码:
extern "C" JNIEXPORT void JNICALL
Java_com_example_afl_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
// env->DefineClass(...)
}
我正在从 Java 端代码调用上述函数:
public class MainActivity extends AppCompatActivity {
static {
System.loadLibrary("native-lib");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
stringFromJNI(); // call cpp function
}
public native String stringFromJNI();
}
我的问题是关于cpp代码中的env->DefineClass(...)
。
如您所见,android VM 将 JNIEnv *env
传递给我的本机函数,因此通过使用 env
指针,我可以访问我所有的 java classes 和我可以使用它们(我可以访问我的所有 java 端 classes 并且我可以创建实例对象并执行所有操作)。
但是如何访问另一个 apk 中的 class 并且它在另一个包名称中?
我想反编译目标 apk 并复制 class 并使用 env->DefineClass
函数将 class 注入我的 env
但我不知道如何完成此任务。
感谢您的回复:)
不可能。 Android does not implement DefineClass
:
All JNI 1.6 features are supported, with the following exception:
DefineClass is not implemented. Android does not use Java bytecodes or class files, so passing in binary class data doesn't work.
即使 有效,您应用的用户很可能没有访问其他应用程序 .apk 的权限。