android jni 详细介绍
来源:互联网 发布:淘宝号可以转让吗 编辑:程序博客网 时间:2024/06/09 05:53
今年下半年, 给上海海思的哥们做过一次android JNI培训,当然培训感兴趣的人不多(都是做芯片的), 讲得很简单,现把培训胶片贴出来:
JNI介绍:
System.loadLibrary(*.so);
System.loadLibrary("simplejni");
}
加载(注册):
ØAndroid_Runtime 中加载
参考:
android_server_BluetoothEventLoop.cpp
AndroidRuntime.cpp
参考:
SampleJNI例子中native.cpp
Android_Runtime中加载:
int register_android_server_BluetoothEventLoop(JNIEnv *env) {
return AndroidRuntime::registerNativeMethods(env,
"android/server/BluetoothEventLoop", sMethods, NELEM(sMethods));
}
static JNINativeMethod sMethods[] = {
/* name, signature, funcPtr */
{"classInitNative", "()V", (void *)classInitNative},
{"initializeNativeDataNative", "()V", (void *)initializeNativeDataNative},
{"cleanupNativeDataNative", "()V", (void *)cleanupNativeDataNative},
{"startEventLoopNative", "()V", (void *)startEventLoopNative},
{"stopEventLoopNative", "()V", (void *)stopEventLoopNative},
{"isEventLoopRunningNative", "()Z", (void *)isEventLoopRunningNative}
}
JNI_OnLoad:
参考: sampleJNI
java调用C/C++:
参考:development/samples/samplejni
public class SimpleJNI extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
int sum = Native.add(2, 3);
tv.setText("2 + 3 = " + Integer.toString(sum));
setContentView(tv);
}
}
class Native {
static {
// The runtime will add "lib" on the front and ".o" on the end of
// the name supplied to loadLibrary.
System.loadLibrary("simplejni");
}
static native int add(int a, int b);
}
C/C++调用java:
Java_AndroidJniDemo_executeMethod(JNIEnv *env, jobject obj, jclass clazz)
{
// clazz = env->FindClass(className);
jmethodID mid = (*env)->GetMethodID(env, clazz, "show", "()V");
if (mid == NULL) {
return; //如果方法ID没有找到
}
(*env)->CallVoidMethod(env, obj, mid); //执行show方法
}
其它:
void (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
jobject (*CallStaticObjectMethod)(JNIEnv*, jclass, jmethodID, ...);
field_mChannel = get_field(env, clazz, "mChannel", "I");
env->SetIntField(object, field_mChannel, (jint)nat);
其它:
void (*SetShortField)(JNIEnv*, jobject, jfieldID, jshort);
void (*SetIntField)(JNIEnv*, jobject, jfieldID, jint);
…
jobject (*GetObjectField)(JNIEnv*, jobject, jfieldID);
jboolean (*GetBooleanField)(JNIEnv*, jobject, jfieldID);
jboolean (*GetStaticBooleanField)(JNIEnv*, jclass, jfieldID);
void (*SetStaticBooleanField)(JNIEnv*, jclass, jfieldID, jboolean);
…
JNI数据类型:
[ 表示一维数组,[[ 二维数组……
L 表示是对象类型
java.lang.String;(一定要有分号) 对象的标准类名
[I 表示 int [];[L/java/lang/objects;表示Objects[],另外,引用类型(除基本类型的数组外)的标示最后都有个";“
如:
method_onAgentAuthorize = env->GetMethodID(clazz, "onAgentAuthorize",
"(Ljava/lang/String;Ljava/lang/String;I)V");
JNI 中的异常:
参考:Jni.h
JNI异常的用法:
if (env->ExceptionCheck()) {
env->ExceptionDescribe();
env->ExceptionClear();
}
env->ThrowNew(env->FindClass("java/lang/Exception"),
"xxx异常");
jthrowable mException = env->ExceptionOccurred();
if (mException != NULL) {
env->Throw(mException);
}
- android jni 详细介绍
- [android jni]android JNI 详细介绍
- Java JNI 详细介绍
- 【android&&jni&&NDk】详细介绍每一步,让你轻松掌握android JNI NDk
- 较详细的介绍JNI
- 较详细的介绍JNI
- 较详细的介绍JNI
- 较详细的介绍JNI
- 较详细的介绍JNI
- 较详细的介绍JNI
- 较详细的介绍JNI
- 较详细的介绍JNI
- 较详细的介绍JNI
- 较详细的介绍JNI
- 较详细的介绍JNI
- 较详细的介绍JNI
- 较详细的介绍JNI
- 较详细的介绍JNI
- 源码安装和配置apache(httpd)和 PHP 和 mysql全过程(二)
- PHP在WIN7下面CURL无法加载的解决办法
- strcat函数
- Oracle与DST(daylight saving time)
- Android应用程序窗口(Activity)的运行上下文环境(Context)的创建过程分析
- android jni 详细介绍
- WAMP安装出现没有找到MSVCR100.DLL所以这个应用程序未能启动
- 站内消息表的设计
- 关于西游记裁员的问题
- SpringMVC学习
- 开源空间信息软件体系与技术概述
- 在Windows下操作Linux的多标签工具
- HTML5 缓存: cache manifest
- iis6.0 php5.2.17 mysql 安装 win2003