<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;
}
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);
}
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处理后回传回去显示。