NDK Java JNI调用
2013-11-05 10:52
281 查看
这次主要学习NDK C调用JAVA 类,这种做法可以作为回调,比如JNI层获取网络数据 然后回调JAVA层 把获取的网络数据传给应用层并显示。
创建一个简单的User类,和 SimpleAction.
在JNI层实例化一个User类,并设置值,传给SimpleAction类,然后JNI层调用doLogin方法 打印出User类的信息。
编译工程后,获取相关签名
编写一个native方法。
javah命令生成头文件
重点实现里面的函数体。
在Activity里面直接调用即OK
SimpleAction action = new SimpleAction();
new JNI().processAction(action);
创建一个简单的User类,和 SimpleAction.
在JNI层实例化一个User类,并设置值,传给SimpleAction类,然后JNI层调用doLogin方法 打印出User类的信息。
public class User { public String uid; public String username; public int age; public User() { } public void setUid(String uid) { this.uid = uid; } public void setUsername(String username) { this.username = username; } public void setAge(int age) { this.age = age; } public String toString() { return "uid:" + uid + ",username:" + username + ",age:" + age; } }
public class SimpleAction { private User user; public SimpleAction() { } public void doLogin(){ System.err.println("doLogin:" + this.user); } public void setUser(User u){ this.user = u; } }
编译工程后,获取相关签名
编写一个native方法。
public class JNI { public native void processAction(SimpleAction action); }
javah命令生成头文件
重点实现里面的函数体。
JNIEXPORT void JNICALL Java_com_birds_android_ndk_JNI_processAction (JNIEnv *env, jobject job, jobject actionObj) { jclass userCls = (*env)->FindClass(env,"com/birds/android/ndk/User"); if (userCls) { // 找到User类的 MethodId. jmethodID mid = (*env)->GetMethodID(env,userCls,"<init>","()V"); jobject userObj = (*env)->NewObject(env,userCls,mid); // 得到User中Set方法的Method Id jmethodID age = (*env)->GetMethodID(env, userCls, "setAge", "(I)V"); jmethodID username = (*env)->GetMethodID(env, userCls, "setUsername", "(Ljava/lang/String;)V"); jmethodID uid = (*env)->GetMethodID(env, userCls, "setUid", "(Ljava/lang/String;)V"); // 创建2个值给uid和username的. jstring uidv = (*env)->NewStringUTF(env,"200212"); jstring unamev = (*env)->NewStringUTF(env,"birds"); jint agev = 34; //设置值调用方法 (*env)->CallVoidMethod(env, userObj, age, agev); (*env)->CallVoidMethod(env, userObj, username, unamev); (*env)->CallVoidMethod(env, userObj, uid, uidv); //把User实例传给SimpleAction jclass actionCls = (*env)->GetObjectClass(env,actionObj); jmethodID mid2 = (*env)->GetMethodID(env, actionCls, "setUser", "(Lcom/birds/android/ndk/User;)V"); (*env)->CallVoidMethod(env, actionObj, mid2, userObj); //最后调用doLogin方法 jmethodID mid3 = (*env)->GetMethodID(env, actionCls, "doLogin", "()V"); (*env)->CallVoidMethod(env, actionObj, mid3); } }
在Activity里面直接调用即OK
SimpleAction action = new SimpleAction();
new JNI().processAction(action);
相关文章推荐
- 王学岗NDK系列(二):JNI:c /c++调用java属性和函数
- JNI NDK (AndroidStudio+CMake )实现C C++调用Java代码流程
- Android 基于NDK的JNI开发 C调用java和java调用C的进阶教程
- Android-本地方法与Java相互调用-自定义ProgressBar(锅炉压力监测例子)/NDK-JNI开发实例(七)
- Android JNI/NDK开发(2)JNI实现C/C++与Android/JAVA相互调用
- NDK开发(1)——JAVA通过JNI调用C代码详细步骤
- Android-NDK开发之基础--Android JNI实例代码(一)-- 在JNI中执行Java方法--C/C++调用Java
- [原创]Android 基于NDK的JNI开发 C调用java和java调用C的进阶教程
- 【学习Android NDK开发】Java通过JNI调用native方法
- NDK .so Android调用JNI出错 java.lang.UnsatisfiedLinkError: No implementation found for的解决方案
- Android-NDK开发之基础--Android JNI实例代码(一)-- 在JNI中执行Java方法--C/C++调用Java
- Android 基于NDK的JNI开发 C调用java和java调用C的进阶教程
- JNI和NDK编程(四)JNI调用Java方法的流程
- 在Android Studio下编写JNI(二)NDK调用java
- 01_JNI是什么,为什么使用,怎么用JNI,Cygwin环境变量配置,NDK案例(使用Java调用C代码),javah命令使用
- 转战Android之NDK(jni, java调用c/c++)
- (NDK基础一)JNI中C调用Java方法
- 01_JNI是什么,为什么使用,怎么用JNI,Cygwin环境变量配置,NDK案例(使用Java调用C代码),javah命令使用
- 转战Android之NDK(jni, c/c++调用java)
- (转)java 层调用Jni(Ndk) 持久化c c++ 对象