android开发之史上最全系列之android高级篇之JNI

一,JNI介绍
百度百科 :  http://baike.baidu.com/view/1272329.htm



二,JNI开发教程
1,JNI注册方式有两种,一种是静态方式,一种是动态方式,
静态方式的使用见链接  http://www.yesky.com/249/1748749.shtml  
笔者不多加赘述,hello-jni的原始代码就是采用这样的方式,笔者不怎么喜欢,所以采用了动态方式,以下的文章均采用动态方式。
动态方式:
a,需要注册的方法结构体 
代码片段,双击复制
01
02
03
static JNINativeMethod const gMethods[] =
{
{ "stringFromJNI" , "()Ljava/lang/String;" , ( void *) stringFromJNI }, };

b,注册方式
代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
jint JNI_OnLoad(JavaVM *jvm, void *reserved) {
    JNIEnv* env = NULL;
    if (jvm->GetEnv(( void **) &env, JNI_VERSION_1_4) != JNI_OK) {
         LOGD( ">>>Get env faild!!!" );
         return -1;
    }
    jclass clazz = (env)->FindClass( "com/example/hellojni/HelloJni" );
    if (!clazz) {
         LOGE( ">>>>Can't find com/example/hellojni/HelloJn class!!! " );
    }
    (env)->RegisterNatives(clazz, gMethods, sizeof (gMethods) / sizeof (gMethods[0]));
    jclass clazz2 = (env)->FindClass( "com/example/hellojni/AnotherThreadJNITest" );
    if (!clazz2) {
         LOGE( ">>>>Can't find com/example/hellojni/AnotherThreadJNITest class!!! " );
    }
    (env)->RegisterNatives(clazz2, gMethods2, sizeof (gMethods2) / sizeof (gMethods2[0]));
    LOGD( ">>>>JNI_OnLoad Called!!!" );
    return JNI_VERSION_1_4;
 
}

c,注销方式
代码片段,双击复制
01
02
03
04
void JNI_OnUnload(JavaVM *jvm, void *reserved) {
    LOGD( ">>>>JNI_OnUnload Called!!!" );
    return ;
}

我们注意代码
代码片段,双击复制
01
(env)->RegisterNatives(clazz, gMethods, sizeof (gMethods) / sizeof (gMethods[0]));

这个就是想dalvik注册native方法。
具体例子见笔者博客  http://my.eoe.cn/21517/archive/2896.html
2,java层方法声明
代码片段,双击复制
01
public native String stringFromJNI();

这里不需要写方法体,只需要声明,另外访问类型没有关系,那个只是针对java语法的
3,载入so代码如下
代码片段,双击复制
01
02
03
04
static {
         System.loadLibrary( "hello-jni" );
         System.loadLibrary( "srtp-jni" );
    }

至于 System.loadLibrary分析见笔者博客 http://my.eoe.cn/21517/archive/2897.html
4,JNI API 分类
a, JAVA 传递整数,字符串,数组给C++
b,C++传递整数,字符串,数组给C++
见  http://my.eoe.cn/21517/archive/2896.html
c,C++创建native 线程
http://my.eoe.cn/21517/archive/2911.html
d,C++回调Java方法
代码片段,双击复制
01
02
03
04
    jclass cls = (env)->GetObjectClass(obj);
//    jmethodID updateMatrixMethod = (env)->GetMethodID(cls,"updateModelviewMatrix","([F)V");//JPCTDraw
    jmethodID updateMatrixMethod = (env)->GetMethodID(cls, "JPCTDraw" , "()V" ); //
env->CallVoidMethod(obj, updateMatrixMethod);

这个是笔者开发AR中的代码,回调java中的JPCTDraw方法。
e,C++抛异常给java
http://my.eoe.cn/21517/archive/2915.html
5,JNI原理部分
由于这个部分原理性比较强,而且笔者也是通过阅读android源码了解的,知识点比较零碎,鉴于笔者功力,错误在所难免,所以这个部分就给个笔者博客的链接
http://my.eoe.cn/21517/archive/4473.html

你可能感兴趣的:(android开发之史上最全系列之android高级篇之JNI)