在android中调用C语言接口时,要为native函数名称,命名规则是Java_包名(点用下划线替换)_类名_函数自定义名称,举个例子:

在java类JninameActivity(包名为com.ckl.jniname)中声明native接口:

private native String getJniString();

对应Jni函数名称需定义为下面这样:

jstring Java_com_ckl_jniname_JninameActivity_getJniString(JNIEnv* env, jobject thiz)
{
//
}


如果使用的接口较多,这么长的函数名称将是比较麻烦的事情,这里使用宏定义的方法,可以减轻jni函数命名的工作量。

//定义包名+类名

#define classcom_ckl_jniname_jninameactivity

//这里的宏一定要这样定义,才能合成出正确的函数名称

#define name3(class3, func3) Java_##class3##_##func3

#define name2(class2, func2) name3(class2, func2)

#define name(func) name2(class, func)

//name(getjnistring) 编译时将被替换为 java_com_ckl_jniname_jninameactivity_getjnistring

jstring name(getjnistring)(jnienv* env, jobject thiz)

{

return (*env)->newstringutf(env, "i am form jni !");

}

jstring name(getname)(jnienv* env, jobject thiz)

{

return (*env)->newstringutf(env, "i am jack, ");

}

jstring name(getage)(jnienv* env, jobject thiz)

{

return (*env)->newstringutf(env, "20 !");

}



关键是宏NAME(FUNC)的定义,一定按照下面的方法定义,才能合成出正确的函数名称

#define NAME3(CLASS3, FUNC3) Java_##CLASS3##_##FUNC3
#define NAME2(CLASS2, FUNC2) NAME3(CLASS2, FUNC2)
#define NAME(FUNC) NAME2(CLASS, FUNC)



当然,还有另外一种更常用的方法,

即在JNI_OnLoad()中使用(*env)->RegisterNatives()将需要用到的native接口注册好,

这样就不用按照上面的规则给jni函数取很长的名称了。


更多相关文章

  1. Android(安卓)EventBus实战
  2. Android中自定义AlertDialog使用
  3. android实现侧边导航栏
  4. Android—实现自定义相机倒计时拍照
  5. Android(安卓)可以自定义的标题
  6. 2011.09.14(3)——— android 自定义tabhost的tabs
  7. Android(安卓)贪吃贪游戏(源码详解和改进)
  8. 【开源项目12】Retrofit – Java(Android) 的REST 接口封装类库
  9. Android(安卓)Studio 自定义Gradle Plugin

随机推荐

  1. Android共享数据ContentProvider的使用
  2. 求 在独立service 中 调用contentprovide
  3. Android 解决setRequestedOrientation之
  4. 10.ScrollView
  5. Android线程调度机制
  6. 识别你的手机 Android的属性系统
  7. android View 重绘机制
  8. Android cocos2d-x开发(三)之创建Android工
  9. Ubuntu下查找.android/avd
  10. Android(安卓)多点触控(放大、缩小、旋转