使用宏定义,简单实现jni函数命名
来源:互联网 发布:雅思考试推荐用书 知乎 编辑:程序博客网 时间:2024/06/09 12:22
在android中调用C语言接口时,要为native函数名称,命名规则是Java_包名(点用下划线替换)_类名_函数自定义名称,举个例子:
对应Jni函数名称需定义为下面这样:
jniname.c
关键是宏NAME(FUNC)的定义,一定按照下面的方法定义,才能合成出正确的函数名称
效果如下:
在java类JninameActivity(包名为com.ckl.jniname)中声明native接口:
private native String getJniString();
对应Jni函数名称需定义为下面这样:
jstring Java_com_ckl_jniname_JninameActivity_getJniString(JNIEnv* env, jobject thiz){//}如果使用的接口较多,这么长的函数名称将是比较麻烦的事情,这里使用宏定义的方法,可以减轻jni函数命名的工作量。
jniname.c
#include <jni.h>//定义包名+类名#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_getJniStringjstring 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)
JninameActivity.javapackage com.ckl.jniname;import android.app.Activity;import android.os.Bundle;import android.widget.TextView;public class JninameActivity extends Activity {TextView mText1, mText2; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mText1 = (TextView)findViewById(R.id.text1); mText2 = (TextView)findViewById(R.id.text2); mText1.setText(getJniString()); mText2.setText(getName() + getAge()); } private native String getJniString(); private native String getName(); private native String getAge(); static { System.loadLibrary("jniname"); }}
效果如下:
工程代码:jniname.7z
当然,还有另外一种更常用的方法,
即在JNI_OnLoad()中使用(*env)->RegisterNatives()将需要用到的native接口注册好,
这样就不用按照上面的规则给jni函数取很长的名称了。
可以参考 http://blog.csdn.net/zhenyongyuan123/article/details/5862054
- 使用宏定义,简单实现jni函数命名
- 函数定义命名空间的使用
- 深入了解android平台的jni---使用宏定义精简JNI接口函数名称
- Android-JNI(4)-简单函数的实现
- 简单的通过宏定义实现自定义打印函数
- 函数命名只定义、实现了一次,却被提示早已定义
- 简单的JNI实现
- Java JNI简单实现
- Java JNI简单实现
- 简单JNI编程实现
- JNI简单实现demo
- JNI中函数的命名及调用
- Android JNI调用函数命名原则规范
- JNI 简单使用小结
- jni得简单使用
- JNI的简单使用
- 简单使用JNI
- jni简单使用
- Oracle存储过程 MySql存储过程 SqlServer存储过程 Oracle 触发器语法及实例
- delphi bmp scanline
- 简单的程序诠释C++ STL算法系列之十一:search_n
- 使用VBS程序自动配置计算机IP地址(改进版)
- android获取手机屏幕大小
- 使用宏定义,简单实现jni函数命名
- 数据结构算法
- C#类,类成员访问修饰符
- VPN加密算法大全
- Jsp页面使用JavaBeans
- Samsung Announced First Smart TV App Developed Using Adobe AIR
- java接口作用(2)
- 关于文件流的写入与读取总结
- IP组播与组播协议