关于Android NDK-r4的使用

关于JNI的搭建,有两种方式,一种是传统的在C/C++模块入口中提供native方法注册,实例代码如下:

/*
 * JNI registration.
 */
static JNINativeMethod gNativeMethods[] = {
    { "nativeMethod1", "(I)V", (void*) method1 },
    { "nativeMethod2", "(IIII)V", (void*) method2},
    { "nativeMethod3", "(I)V", (void*) method3 },
};

EXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) {

    JNIEnv* env = NULL;

    if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
        return -1;
    }

    jniRegisterNativeMethods(env, "xxx/xxx/xxx/xxx",
                             gNativeMethods, NELEM(gNativeMethods));

    return JNI_VERSION_1_4;
}
这里除了要包含jni.h以外,还需要包含JNIHelp.h文件,这个文件提供了jniRegisterNativeMethods方法和MELEM定义


第二种是NDK提供的方式,就是不用显式的注册,只需要按照java类名在命名native方法,比如在java类com.android.Foo中声明了一个native void foo()的方法,在C/C++模块中只需要实现void Java_com_android_Foo_foo(JNIEnv* env, jobject thiz)的方法就可以了,这里有个注意的地方,就是java类名不能出现下划线“_”,否则与这种命名方式发生冲突,在运行时会找不到实现而异常


实际中,我们有可能会移植第一种方式的native模块在NDK中使用,在编译中会遇到找不到JNIHelp.h的问题,原因是这个头文件在Android中没有公开,只限于内部使用,今后有可能会更改,参考链接


解决方法:

  • 改成第二种方式
  • 加入JNIHelp.h文件,这个文件在dalvik\libnativehelper\include\nativehelper\JNIHelp.h下面(以后可能有风险)
  • 自定义NELEM:

#ifndef NELEM

#define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))

#endif

可以看到这个就是计算数组元素个数了,然后把jniRegisterNativeMethods改成:

jclass jYourclass = env->FindClass("xxx/xxx/xxx/xxx");

env->RegisterNatives(jYourClass,

    		gNativeMethods, NELEM(gNativeMethods));

这里的第二个语句应该是可以写成:

(*env)->RegisterNative(env, ...);

的,但我这里一直编译不过,不知道怎么回事,好像是跟这个文件扩展名是c还是cpp有关系








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值