android jni 调用结构体示例
16lz
2021-12-04
MainActivity
package com.example.hello2;import android.os.Bundle;import android.app.Activity;import android.util.Log;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends Activity implements OnClickListener { private Button btn; static{ System.loadLibrary("hello2"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn=(Button) findViewById(R.id.btn); btn.setOnClickListener(this); } public native void add(int a,int b); public native DiskInfo getStruct(DiskInfo disk_info);@Overridepublic void onClick(View arg0) {DiskInfo disk_info=new DiskInfo(1,"ZKK");getStruct(disk_info);Log.i("zhouke", "::"+disk_info.name+"::"+disk_info.serial);} }
package com.example.hello2;public class DiskInfo {public String name; // public int serial; //public DiskInfo(int num, String myname) {serial = num;name = myname;}}
.h 文件
/* DO NOT EDIT THIS FILE - it is machine generated */#include /* Header for class com_example_hello2_MainActivity */#ifndef _Included_com_example_hello2_MainActivity#define _Included_com_example_hello2_MainActivity#ifdef __cplusplusextern "C" {#endif/* * Class: com_example_hello2_MainActivity * Method: add * Signature: (II)V */JNIEXPORT void JNICALL Java_com_example_hello2_MainActivity_add (JNIEnv *, jobject, jint, jint);/* * Class: com_example_hello2_MainActivity * Method: getStruct * Signature: (Lcom/example/hello2/DiskInfo;)Lcom/example/hello2/DiskInfo; */JNIEXPORT jobject JNICALL Java_com_example_hello2_MainActivity_getStruct (JNIEnv *, jobject, jobject);#ifdef __cplusplus}#endif#endif
c文件
#include "com_example_hello2_MainActivity.h"#include #include #include #define LOG_TAG "cTag"#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)struct{ char name[256]; int serial;};JNIEXPORT void JNICALL Java_com_example_hello2_MainActivity_add (JNIEnv * env, jobject obj, jint x, jint y){int result = x + y;LOGD("result=%d", result);}JNIEXPORT jobject JNICALL Java_com_example_hello2_MainActivity_getStruct (JNIEnv * env, jobject obj, jobject diskobj){jclass objectClass = (*env)->FindClass(env, "com/example/hello2/DiskInfo");jfieldID name = (*env)->GetFieldID(env, objectClass,"name","Ljava/lang/String;");jfieldID serial=(*env)->GetFieldID(env,objectClass,"serial","I");(*env)->SetObjectField(env,diskobj,name, (*env)->NewStringUTF(env, "hello world"));(*env)->SetIntField(env,diskobj,serial,10);//(*env)->setInreturn diskobj;}
示例2
MainActiviy
package com.example.hello2;import android.os.Bundle;import android.app.Activity;import android.util.Log;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends Activity implements OnClickListener {private Button btn;static {System.loadLibrary("hello2");}public class Foo {public int len;public String name;}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn = (Button) findViewById(R.id.btn);btn.setOnClickListener(this);}public native void add(int a, int b);public native DiskInfo getStruct(DiskInfo disk_info);private static native int foo(Foo fooObj);@Overridepublic void onClick(View arg0) {/* * DiskInfo disk_info=new DiskInfo(1,"ZKK"); getStruct(disk_info); * Log.i("zhouke", "::"+disk_info.name+"::"+disk_info.serial); */Foo foo = new Foo(); foo(foo); Log.i("zhouke", foo.name); Log.i("zhouke", foo.len+"");}}
hello2.c
#include "com_example_hello2_MainActivity.h"#include #include #include #define LOG_TAG "cTag"#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)struct {char name[256];int serial;};typedef struct Foo {int len;char name[100];} Foo_t;JNIEXPORT void JNICALL Java_com_example_hello2_MainActivity_add(JNIEnv * env,jobject obj, jint x, jint y) {int result = x + y;LOGD("result=%d", result);}JNIEXPORT jobject JNICALL Java_com_example_hello2_MainActivity_getStruct(JNIEnv * env, jobject obj, jobject diskobj) {jclass objectClass = (*env)->FindClass(env, "com/example/hello2/DiskInfo");jfieldID name = (*env)->GetFieldID(env, objectClass, "name","Ljava/lang/String;");jfieldID serial = (*env)->GetFieldID(env, objectClass, "serial", "I");(*env)->SetObjectField(env, diskobj, name,(*env)->NewStringUTF(env, "hello world"));(*env)->SetIntField(env, diskobj, serial, 10);//(*env)->setInreturn diskobj;}JNIEXPORT jint JNICALL Java_com_example_hello2_MainActivity_foo(JNIEnv *env,jobject obj, jobject fooObj) {Foo_t * bar = malloc(sizeof(Foo_t));jclass clazz;jfieldID fid;//init the bar data of Cstrcpy(bar->name, "Yachun Miao");bar->len = strlen(bar->name);// mapping bar of C to fooclazz = (*env)->GetObjectClass(env, fooObj);if (0 == clazz) {LOGD("0==clazz");return (-1);}fid = (*env)->GetFieldID(env, clazz, "len", "I");//(*env)->SetLongField(env, fooObj, fid, bar->len);(*env)->SetIntField(env,fooObj,fid,bar->len);fid = (*env)->GetFieldID(env, clazz, "name", "Ljava/lang/String;");jstring name = (*env)->NewStringUTF(env, bar->name);(*env)->SetObjectField(env, fooObj, fid, name);free(bar);return 0;}
h 文件
/* DO NOT EDIT THIS FILE - it is machine generated */#include /* Header for class com_example_hello2_MainActivity */#ifndef _Included_com_example_hello2_MainActivity#define _Included_com_example_hello2_MainActivity#ifdef __cplusplusextern "C" {#endif/* * Class: com_example_hello2_MainActivity * Method: add * Signature: (II)V */JNIEXPORT void JNICALL Java_com_example_hello2_MainActivity_add (JNIEnv *, jobject, jint, jint);/* * Class: com_example_hello2_MainActivity * Method: getStruct * Signature: (Lcom/example/hello2/DiskInfo;)Lcom/example/hello2/DiskInfo; */JNIEXPORT jobject JNICALL Java_com_example_hello2_MainActivity_getStruct (JNIEnv *, jobject, jobject);JNIEXPORT jint JNICALL Java_com_example_hello2_MainActivity_foo (JNIEnv *, jclass, jobject);#ifdef __cplusplus}#endif#endif
.mk
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := hello2LOCAL_SRC_FILES := hello2.cLOCAL_LDLIBS :=-llog include $(BUILD_SHARED_LIBRARY)
更多相关文章
- NPM 和webpack 的基础使用
- 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
- Android(安卓)播放音乐文件与视频文件
- android ViewPager 使用方法
- android eclipse 项目相互引用设置
- android Menu 选项菜单示例
- Android(安卓)Contacts(一)—— 读取联系人
- android 混淆
- Android中下载文件的使用