新建项目
新建一个c++项目
修改CMakeLists.txt
add_library(test SHARED
# List C/C++ source files with relative paths to this CMakeLists.txt.
test.c)
target_link_libraries(test
# List libraries link to the target library
android
log)
修改加载的库
static {
System.loadLibrary("test");
}
声明两个native方法
public native String stringFromJNI();
新建一个test.c
源文件,实现方法
#include <jni.h>
JNIEXPORT jstring JNICALL
Java_com_example_unidbgtest_MainActivity_stringFromJNI(JNIEnv *env, jobject thiz) {
// TODO: implement stringFromJNI()
char* hello = "Hello from C++";
return (*env)->NewStringUTF(env,hello);
}
运行,可以正常运行
Build
Build Apk,然后把so从apk中拖出来
在unidbg中找一个目录把so放进去
然后新建一个类
package com.example.unidbgtest;
import com.github.unidbg.AndroidEmulator;
import com.github.unidbg.Module;
import com.github.unidbg.linux.android.AndroidEmulatorBuilder;
import com.github.unidbg.linux.android.AndroidResolver;
import com.github.unidbg.linux.android.dvm.DalvikModule;
import com.github.unidbg.linux.android.dvm.DvmClass;
import com.github.unidbg.linux.android.dvm.DvmObject;
import com.github.unidbg.linux.android.dvm.VM;
import com.github.unidbg.linux.android.dvm.wrapper.DvmInteger;
import com.github.unidbg.memory.Memory;
import java.io.File;
import java.io.IOException;
public class unidbgtest {
private final VM vm;
private final DvmClass dvmClass;
private final AndroidEmulator emulator;
private Memory memory;
private String process = "com.example.unidbgtest";
private String className = "com/example/unidbgtest/MainActivity";
private Module module;
public unidbgtest(){
// 创建设备
emulator = AndroidEmulatorBuilder.for64Bit().setProcessName(process).build();
// 获取内存对象
memory = emulator.getMemory();
// 设置Android Sdk版本
memory.setLibraryResolver(new AndroidResolver(23));
// 创建虚拟机
vm = emulator.createDalvikVM(new File("apks/libtest.so"));
vm.setVerbose(true);
DalvikModule dm = vm.loadLibrary(new File("unidbg-android/src/test/java/com/example/unidbgtest/apks/libtest.so"), true);
dm.callJNI_OnLoad(emulator);
module = dm.getModule();
dvmClass = vm.resolveClass(className);
}
public static void main(String[] args) throws IOException {
unidbgtest unidbgtest01 = new unidbgtest();
unidbgtest01.start();
unidbgtest01.stop();
}
private void start(){
DvmObject<?> result = dvmClass.callStaticJniMethodObject(emulator, "stringFromJNI()Ljava/lang/String");
System.out.println("result=" + result);
}
private void stop() throws IOException {
emulator.close();
}
}