首页
社区
课程
招聘
[求助]ndk下断点到JNI_Onload
发表于: 2015-8-1 22:21 7347

[求助]ndk下断点到JNI_Onload

2015-8-1 22:21
7347
在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;
}
收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 199
活跃值: (99)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
注册的类名 分割符写错了
2015-8-2 22:50
0
雪    币: 11
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
if (!registerNativeMethods(env,"com.example.jniexception.MainActivity",gmethods,sizeof(gmethods)/sizeof(gmethods[0])))
  {
    return JNI_FALSE;
  }
要改成
if (!registerNativeMethods(env,"com/example/jniexception/MainActivity",gmethods,sizeof(gmethods)/sizeof(gmethods[0])))
  {
    return JNI_FALSE;
  }
2015-8-3 09:12
0
雪    币: 22
活跃值: (242)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
4
非常感谢,请问eclipse怎么才能下断点在JNI_Onload函数,我在其他native函数可以断,就是JNI_Onload一直断不下来
2015-8-3 21:04
0
雪    币: 22
活跃值: (242)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
5
[QUOTE=siliconlee;1384582]if (!registerNativeMethods(env,"com.example.jniexception.MainActivity",gmethods,sizeof(gmethods)/sizeof(gmethods[0])))
  {
    return JNI_FALSE;
  }
要...[/QUOTE]
非常感谢,请问eclipse怎么才能下断点在JNI_Onload函数,我在其他native函数可以断,就是JNI_Onload一直断不下来
2015-8-3 21:05
0
雪    币: 11
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
http://www.tuicool.com/articles/RNfyUf
可以参看这个,主要是用IDA和eclipse联调才好用。
2015-8-4 09:51
0
雪    币: 22
活跃值: (242)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
7
我主要是想调试我自己写的JNI_Onload的源码,如果用ida的话,我就要调试汇编了
2015-8-4 10:59
0
游客
登录 | 注册 方可回帖
返回
//