JNI传参数

来源:互联网 发布:unity3d引擎架构 编辑:程序博客网 时间:2024/06/08 09:16
<span style="font-size:32px;"><strong>C通过JNI传递结构体到java:</strong></span>

直接上C的实现
typedef struct Foo {
    int len;
    char name[100];
} Foo_t;

JNIEXPORT jint JNICALL
Java_TestJNI_foo(JNIEnv *env, jobject obj, jobject fooObj) {

    Foo_t * bar = malloc(sizeof(Foo_t));
    jclass clazz;
    jfieldID fid;

    //init the bar data of C
    strcpy(bar->name, "Yachun Miao");
    bar->len = strlen(bar->name);

    // mapping bar of C to foo
    clazz = (*env)->GetObjectClass(env, fooObj);
    if (0 == clazz) {
        printf("GetObjectClass returned 0\n");
        return (-1);
    }
    fid = (*env)->GetFieldID(env, clazz, "len", "I");
    (*env)->SetLongField(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;
}

对应的Java调用
public class Foo {
    protected int len;
    protected String name;
}


    private static native int foo(Foo fooObj);

    public static void main(String args[]) {
        System.loadLibrary("mylib");

        Foo foo = new Foo();
        foo(foo);
        System.out.println(foo.name);
        System.out.println(foo.len);

    }

java向C传递string参数:
MainActivity.java
 
public class MainActivity extends Activity {TextView text1;String string="hello world";private static native String foo1(String string);@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);System.loadLibrary("ChuanDi1");text1=(TextView)findViewById(R.id.text1);text1.append(foo1(string));Log.e("fdas","length -->foo1(string)"+(foo1(string)).length());}}
chuandu1.c
#include <jni.h>#include <string.h>#include <stdio.h>#include <android/log.h>#define  LOG_TAG    "Chuandi1"#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)JNIEXPORT jstring JNICALL Java_com_example_chuandi1_MainActivity_foo1(JNIEnv * env, jclass obj,jstring string){ int i; int j=0; char buf[128]="hahha";//必须初始化,否则会出现在末尾的“0\”位置上乱码 const jbyte *str; str = (*env)->GetStringUTFChars(env,string,NULL); j=(*env)->GetStringUTFLength(env,string); LOGE("the GetStringUTFChars-->%d",j); if(str == NULL){  return NULL; } for(i =0 ; i<j; i++){  buf[i] = *(str+i); } LOGE("buf--->%s",buf); LOGE("buf length -->%d",sizeof(buf)); return (*env)->NewStringUTF(env, buf);}//返回经过chuandi1.c处理过的字符串返回到MainActivity中

Android.mk
LOCAL_PATH :=$(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE :=ChuanDi1LOCAL_SRC_FILES :=chuandi1.cLOCAL_LDLIBS := -lm -lloginclude $(BUILD_SHARED_LIBRARY)
本例子中其实是java传给jni处理后回传回去显示。
0 0
原创粉丝点击