1.创建工程,添加jni
2. main.cpp
#include <jni.h>
struct test_data
{
char name[256];
int num;
double average;
};
extern "C" {
JNIEXPORT jobject JNICALL Java_com_re_struct_MainActivity_call(JNIEnv * env, jobject obj, jobject classobj);
};
JNIEXPORT jobject JNICALL Java_com_re_struct_MainActivity_call(JNIEnv * env, jobject obj, jobject classobj)
{
jclass objectClass = env->FindClass("com/re/struct/test_data");
jfieldID name = env->GetFieldID(objectClass, "name", "Ljava/lang/String;");
jfieldID num = env->GetFieldID(objectClass, "num", "I");
jfieldID average = env->GetFieldID(objectClass, "average", "D");
env->SetObjectField(classobj, name, env->NewStringUTF("hello world"));
env->SetIntField(classobj, num, 10);
env->SetDoubleField(classobj, average, 2.5);
return classobj;
}
3. test_data.java
package com.re.struct;
public class test_data {
public String name;
public int num;
public double average;
}
4. MainActivity.java
package com.re.struct;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
public class MainActivity extends Activity {
static{
System.loadLibrary("main");
}
private native test_data call(test_data data);
private test_data data = new test_data();
private static final String TAG="######";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
data = call(data);
Log.e(TAG, "name:" + data.name);
Log.e(TAG, "num:" + data.num);
Log.e(TAG, "average:" + data.average);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
5. 效果:
6. 补充:
|
Java类型 | 符号 |
| boolean | Z |
|
byte | B |
|
char | C |
| short | S |
| int | I |
| long | L |
| float | F |
|
double | D |
|
void | V |
| objects对象 | Lfully-qualified-class-name; L类名; |
| Arrays数组 | [array-type [数组类型 |
| methods方法 | (argument-types)return-type(参数类型)返回类型 |
本文介绍了一个使用JNI从C/C++代码调用Java结构体的具体示例。通过创建一个简单的Android应用,演示了如何定义Java结构体类、实现JNI接口以及在Java和C/C++之间传递结构体数据。
675

被折叠的 条评论
为什么被折叠?



