一,JNI介绍
百度百科 : http://baike.baidu.com/view/1272329.htm
二,JNI开发教程
1,JNI注册方式有两种,一种是静态方式,一种是动态方式,
静态方式的使用见链接 http://www.yesky.com/249/1748749.shtml
笔者不多加赘述,hello-jni的原始代码就是采用这样的方式,笔者不怎么喜欢,所以采用了动态方式,以下的文章均采用动态方式。
动态方式:
a,需要注册的方法结构体
b,注册方式
c,注销方式
我们注意代码
这个就是想dalvik注册native方法。
具体例子见笔者博客 http://my.eoe.cn/21517/archive/2896.html
2,java层方法声明
这里不需要写方法体,只需要声明,另外访问类型没有关系,那个只是针对java语法的
3,载入so代码如下
至于 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方法
这个是笔者开发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
百度百科 : 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