您的位置:首页 > 移动开发 > Android开发

JNI编写

2015-11-22 21:37 615 查看
在开发Android的时,有时会有这样的需求。在Java层写代码,写得不尽兴,或者说用Java代码写起来不顺畅。但是换个角度,如果把该部分放到C中去写,就会让人心旷神怡了。甚至极少部分代码就是需要放到C中去写的。

鉴于以上的需求,JNI就找到自己的饭碗了。JNI就是联通Java与C的桥梁。不管是Java向C过度,还是C向Java过度。JNI都是必不可少的。虽然JNI写起来很烦,真的很烦。

JNI怎么写:

首先需要在Java类中定义native方法:

        public static Native void test();

此处的test方法是供Java层代码调用的,调用该方法时,会通过jni调用到C层对应的test方法实现。

然后创建C代码文件。主要有以下方式

1、使用Javah命令。

在cmd命令界面将命令符位置调整到对应Android应用的代码路径下:

         D:\workspace\应用名\src>javah
-classpath D:\workspace\ 应用名\src\完整包名\类名 -d
d:/ -jni完整包名.类名

实例:

如果是在Java工程中,javah命令如下:

javah -classpath D:\MyProgram\JavaProgram\TestJNIProgram\bin -d d:/ -jni com.test.jni.JniCall


如果是在Android工程中,javah命令如下:

javah -classpath D:\MyProgram\AndroidProgram\TestJNIProgram\bin\classes -d d:/ -jni com.test.jni.JniCall

使用javah命令后,会生成一个C文件,只需要实现C文件中的方法即可。

参考博客:http://www.cnblogs.com/kissazi2/p/3298884.html


 

2、 直接写。

如果使用前面种方法,次数多了以后,会发现其实每次javah命令生成的文件中,方法名都是有规律的:

JNIEXPORT void JNICALL Java_com_test_jni_JniCall_test (JNIEnv *, jobject);
JNIEXPORT 返回类型 JNICALL java_完整包名_类名(JNIEnv *, jobject,参数类型);
这种方法极力不推荐,首先是参数,jni的参数类型和java/c的参数类型是有区别的,还有就是用这用方法写出来的jni方法名很容易出错。所以不推荐使用。
    
3、在C代码中注册jni方法。
这个方法还是首先需要在java层添加native方法的,只不过不需要javah命令出来的jni方法名那么一长串。注册的方法,方法名遵循C的方法名规范。
步骤如下:
3.1 首先需要重写OnLoad方法
jint JNI_OnLoad(JavaVM* vm, void* reserved) {
 JNIEnv* e;
 (*vm)->GetEnv(vm, (void**) &e, JNI_VERSION_1_4);
 registerFun(e);
 return JNI_VERSION_1_4;
}
3.2 其次需要实现jni方法注册的方法
static void registerFun(JNIEnv* env) {
 static JNINativeMethod gMethods[] = {
          {"native_start", "()I",(void*)native_start},
          {"native_stop", "()V",(void*)native_stop},
          {"native_ioconnect", "()V",(void*)native_ioconnect},
  };
 jint nRes = (*env)->RegisterNatives(env, g_clazz, gMethods, sizeof(gMethods) / sizeof(gMethods[0]));
 if (nRes < 0)
  printf("registerFun> RegisterNatives failed!");
}
3.3实现已经注册的jni方法
int native_start(){}
void native_stop(){}
void native_ioconnect(){}

以上3中方法是本人在工作中使用过的,以第一种最常用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jni android