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;
}
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);@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
- JNI传参数
- JNI参数传递|Surface
- JNI 参数传递分析
- jni参数详解
- android jni 参数
- JNI参数传递问题
- JNI传递参数
- Android JNI参数传递
- jni函数参数
- jni传递参数
- JNI 传字符串参数,只输出了第一个字符
- JNI 传递结构体参数
- JNI 返回结构体参数
- JNI 返回结构体参数
- JNI 返回结构体参数
- JNI 传递结构体参数
- JNI 返回结构体参数
- JNI 返回结构体参数
- iOS开发之多媒体播放
- Win32 SDC 编程
- (5119)HDU-类背包
- arcgis脚本Python批量裁切与统计实现
- 酒吧沙发订做_沙发维修_保养沙发知多少?
- JNI传参数
- ssh批量分发数据
- Edit Distance
- linux下mysql忘记密码解决备忘
- ADB server didn't ACK;* failed to start daemon *
- 写一个bat文件,删除文件名符合特定规则,且更改日期在某个日期之前的所有目录
- hdu 1160 FatMouse's Speed
- 匈牙利算法
- 用CSDN的代码仓库托管VS解决方案