/本人的想法是将JAVA对象传过来的值,赋值给结构体STRUCT_User_Info,但是本人以下的赋值好像不行
JAVA 类文件对应C语言结构体User_Info
UserInfo.java
public class UserInfo{
private String name=”hello”;
private int nLeft = 0;
private int nRight = 0;
}
—
test.h头文件
struct STRUCT_User_Info
{
int nLeft;
int nRight;
char *name;
};
—
testJNI.c文件(符合JNI标准)
JNIEXPORT jint JNICALL Java_com_UserInfo(JNIEnv *env, jobject obj){
//获取Java中的实例类
jclass objectClass = (*env)->FindClass(env,”domain/UserInfo”);
JAVA 类文件对应C语言结构体User_Info
UserInfo.java
public class UserInfo{
private String name=”hello”;
private int nLeft = 0;
private int nRight = 0;
}
—
test.h头文件
struct STRUCT_User_Info
{
int nLeft;
int nRight;
char *name;
};
—
testJNI.c文件(符合JNI标准)
JNIEXPORT jint JNICALL Java_com_UserInfo(JNIEnv *env, jobject obj){
//获取Java中的实例类
jclass objectClass = (*env)->FindClass(env,”domain/UserInfo”);
jfieldID temName = (*env)->GetFieldID(env,objectClass,”name”,”Ljava/lang/String;”);
jfieldID temLeft = (env)->GetFieldID(objectClass,”nLeft”,”I”);
jfieldID temRight = (env)->GetFieldID(objectClass,”nRight”,”I”);
struct STRUCT_User_Info userInfo; //本人的想法是将JAVA传过来的值,赋值给结构体STRUCT_User_Info
userInfo.name = temName;//但是这么赋值好像不行
userInfo.nLeft=temLeft;
userInfo.nRight=temRight;
//C函数
callTest(userInfo)//然后以这个结构体作为参数传给c程序
return 0;
}
—
test.c文件(普通C程序)
int callTest(struct STRUCT_User_Info *userInfo{
具体逻辑
………
return 0;
}
解决方案:25分
userInfo.name = temName;//但是这么赋值好像不行
java的String对象存储了字符对象”hello”,不想c语言的char*,只存储了一个指针,这样当然不行。
LZ要做的是提取String对象的内容,然后在JNI中分配一段同样大小的内存,然后存储该字符串。
解决方案:25分
Prompt.java:
class Prompt { // native method that prints a prompt and reads a line private native String getLine(String prompt); public static void main(String args[]) { Prompt p = new Prompt(); String input = p.getLine("Type a line: "); System.out.println("User typed: " + input); } static { System.loadLibrary("Prompt"); } }
JNI文件代码示例:
XXX.c
JNIEXPORT jstring JNICALL Java_Prompt_getLine(JNIEnv *env, jobject obj, jstring prompt) { /* assume the prompt string and user input has less than 128 characters */ char outbuf[128], inbuf[128]; /* 下面的2句提取从Java那边传递过来的字符串到outbuf */ int len = (*env)->GetStringLength(env, prompt); (*env)->GetStringUTFRegion(env, prompt, 0, len, outbuf); printf("%s", outbuf); scanf("%s", inbuf); return (*env)->NewStringUTF(env, inbuf); }
到网上搜索 JNI Programmer’s Guide and Specification 文档,有详细的阐述。
以前做过几个java结合JNI的案子,这份资料帮助很大,呵呵。
解决方案:25分
不要做A语言代码修改为B语言代码的无用功。
也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。
只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。
即可很方便地让A、B两种语言之间协调工作。
也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。
只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。
即可很方便地让A、B两种语言之间协调工作。
解决方案:25分
不直接赋值的。使用 (env)->GetStringLength(jstr );,获取一下长度,或知道长度直接定义一个char数组,然后使用(char*)env->GetStringUTFChars(jstr,0); 获取