在so中反向调用java层的方法,按照ndk的命名规范来写调用是成功的,然后用自己向虚拟机注册映射关系的方法,在JNI_Onload中手动注册的,但是一调用LoadLibrary就崩溃了,应该是JNI_Onload中的注册函数写的有问题,但是不知道应该怎么调试JNI_Onload函数。
public class MainActivity extends Activity {
private static final String TAG = "CCDebug";
static{
System.loadLibrary("jniException");
}
private native String show();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG, show());
}
private void callBack() {
Log.d(TAG, "call back form native !");
throw new NullPointerException();
}
}
下面是Native的代码:
static JNINativeMethod gmethods[] = {
{
"show",
"()Ljava/lang/String;",
(void*)MyFunc
},
};
static int registerNativeMethods(JNIEnv* env,const char *className,
JNINativeMethod* gMethods,int numMethods)
{
jclass clazz;
clazz = env->FindClass(className);
if(clazz == NULL)
{
return JNI_FALSE;
}
//调用JNIEnv提供的注册函数向虚拟机注册
if(env->RegisterNatives(clazz,gMethods,numMethods)<0)
{
return JNI_FALSE;
}
return JNI_TRUE;
}
//JNIEXPORT jstring JNICALL java_com_example_jniexception_MainActivity_show
JNIEXPORT jstring JNICALL MyFunc
(JNIEnv *env, jobject obj)
{
jclass jcls = env->GetObjectClass(obj);
jmethodID jmId = env->GetMethodID(jcls,"callBack","()V");
env->CallVoidMethod(obj,jmId);
if(env->ExceptionCheck())
{
env->ExceptionDescribe();
env->ExceptionClear();
}
return env->NewStringUTF("Show Message Form JNI!");
}
static int registerNatives(JNIEnv *env)
{
if (!registerNativeMethods(env,"com.example.jniexception.MainActivity",gmethods,sizeof(gmethods)/sizeof(gmethods[0])))
{
return JNI_FALSE;
}
return JNI_TRUE;
}
jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
jint result = -1;
JNIEnv* env = NULL;
if (vm->GetEnv((void**)&env,JNI_VERSION_1_4))
{
return result;
}
if (registerNatives(env)!=JNI_TRUE)
{
return result;
}
result = JNI_VERSION_1_4;
return result;
}
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课