jni 自定义对象为参数和返回值
来源:互联网 发布:java 延时队列 编辑:程序博客网 时间:2024/04/29 01:50
android JNI 提供了很强大的支持,不仅可以采用基本类型做为参数和返回值,同时也支持自定义对象做为参数和返回值,以下举例说明。
一、定义作为输入和返回的自定义类 (仅提供两个简单类型和一个打印函数)
- package com.example.jniexample;
- import android.util.Log;
- public class JNIParam {
- public int mInt;
- public String mString;
- JNIParam(){
- mInt = 0;
- mString = "0";
- }
- public void print(String tag){
- Log.d(tag, String.format("print: mInt=%d, mString=%s", mInt, mString));
- }
- }
二. 定义和JNI通信的java封装
功能:测试输入参数和返回值都为自定义对象的本地方法,同时提供必要的调试打印
- package com.example.jniexample;
- public class JNIParamTest {
- private final String TAG = "JNIParamTest";
- static {
- System.loadLibrary("JNIParamTest");
- };
- public void runParamTest(){
- JNIParam paramIn = new JNIParam();
- paramIn.print(TAG);
- JNIParam paramOut = doTest(paramIn);
- if( paramOut != null ) paramOut.print(TAG);
- }
- //JNI
- private native JNIParam doTest(JNIParam paramIn);
- }
三、实现JNI的本地实现
a. 头文件 (JNIParamTest.h)
- /* DO NOT EDIT THIS FILE - it is machine generated */
- #include <jni.h>
- /* Header for class com_example_jniexample_JNIParamTest */
- #ifndef _Included_com_example_jniexample_JNIParamTest
- #define _Included_com_example_jniexample_JNIParamTest
- #ifdef __cplusplus
- extern "C" {
- #endif
- /*
- * Class: com_example_jniexample_JNIParamTest
- * Method: doTest
- * Signature: (Lcom/example/jniexample/JNIParam;)Lcom/example/jniexample/JNIParam;
- */
- JNIEXPORT jobject JNICALL Java_com_example_jniexample_JNIParamTest_doTest
- (JNIEnv *, jobject, jobject);
- #ifdef __cplusplus
- }
- #endif
- #endif
b. c文件 (JNIParamTest.c)
- #include "JNIParamTest.h"
- #include "android/log.h"
- #define TAG "JNI_ParamTest"
- #define LOGD(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, TAG, fmt, ##args)
- /*
- * Class: com_example_jniexample_JNIParamTest
- * Method: doTest
- * Signature: (Lcom/example/jniexample/JNIParam;)Lcom/example/jniexample/JNIParam;
- */
- JNIEXPORT jobject JNICALL Java_com_example_jniexample_JNIParamTest_doTest
- (JNIEnv *env, jobject thiz, jobject paramIn)
- {
- jclass paramInClass = (*env)->GetObjectClass(env, paramIn);
- if( paramInClass){
- jboolean iscopy;
- jfieldID intId = (*env)->GetFieldID(env, paramInClass, "mInt", "I");
- jint num = (int)(*env)->GetIntField(env, paramIn, intId);
- LOGD("num = %d", num);
- jfieldID strId = (*env)->GetFieldID(env, paramInClass, "mString", "Ljava/lang/String;");
- jstring str = (jstring)(*env)->GetObjectField(env, paramIn, strId);
- const char *locstr = (*env)->GetStringUTFChars(env, str, &iscopy);
- LOGD("str = %s", locstr);
- (*env)->ReleaseStringUTFChars(env, str, locstr);
- }
- jclass cls = (*env)->FindClass(env, "com/example/jniexample/JNIParam");
- jmethodID id = (*env)->GetMethodID(env, cls, "<init>", "()V");
- jobject paramOut = (*env)->NewObjectA(env, cls, id, 0);
- jfieldID intId = (*env)->GetFieldID(env, cls, "mInt", "I");
- (*env)->SetIntField(env, paramOut, intId, 1);
- jfieldID strId = (*env)->GetFieldID(env, cls, "mString", "Ljava/lang/String;");
- (*env)->SetObjectField(env, paramOut, strId, (jstring)(*env)->NewStringUTF(env, "1"));
- return paramOut;
- }
四、提供一个测试环境
- package com.example.jniexample;
- import android.os.Bundle;
- import android.app.Activity;
- import android.view.Menu;
- public class JNIExample extends Activity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_jniexample);
- JNIParamTest test = new JNIParamTest();
- test.runParamTest();
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.activity_jniexample, menu);
- return true;
- }
- }
实现了一个Activity, 启动就调用
五、测试结果: (logcat 查看)
- D/JNIParamTest( 6135): print: mInt=0, mString=0
- D/JNI_ParamTest( 6135): num = 0
- D/JNI_ParamTest( 6135): str = 0
- D/JNIParamTest( 6135): print: mInt=1, mString=1
六、其他类型转换可以参考:
http://blog.csdn.net/henry121212/article/details/7482527
0 0
- jni 自定义对象为参数和返回值
- JNI编程中如何传递参数和返回值
- JNI编程中如何传递参数和返回值。
- JNI编程中如何传递参数和返回值。
- JNI编程中如何传递参数和返回值
- JNI编程中如何传递参数和返回值。
- JNI编程中如何传递参数和返回值
- Android的NDK开发JNI传递参数和返回值
- JNI实现回调| JNI调用JAVA函数|参数和返回值的格式
- JNI实现回调| JNI调用JAVA函数|参数和返回值的格式
- JNI实现回调| JNI调用JAVA函数|参数和返回值的格式
- JNI实现回调| JNI调用JAVA函数|参数和返回值的格式
- JNI字符串参数传递与返回值
- android(NDK+JNI)---JNI字符串参数传递与返回值
- jni返回复杂对象
- js处理对象参数值,过滤掉对象参数值为""、null、undefined,并返回一个新对象
- 如果函数的传入参数和返回值是对象
- OC 对象作为方法的参数和返回值传递
- sscanf,sscanf_s及其相关用法
- About ruby array
- 【交互设计】手机应用交互设计的顿悟
- web api 单点登录(SSO) 权限验证
- 2.Windows窗口和消息
- jni 自定义对象为参数和返回值
- 立此存照(15)[C++]C++调用swap函数交换2个指针的值
- Mat,cvMat和IplImage
- gridview控件中OnRowDataBound属性作用
- 微软同步框架入门开篇(附SnapShot快照Demo)
- js 操作json
- 转基于.Net的单点登录(SSO)解决方案
- JavaScript获取iframe子页面全局变量
- arm-linux移植MT7601Uusb无线网卡(小度wifi,360随身WIFI 2代)