JNI传参数

<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);
	@Override
	protected 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 :=ChuanDi1
LOCAL_SRC_FILES :=chuandi1.c
LOCAL_LDLIBS := -lm -llog
include $(BUILD_SHARED_LIBRARY)
本例子中其实是java传给jni处理后回传回去显示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值