//作者srx@csdn
class pp{
public String tmp ;
public void setTmp(String tmp_){
this.tmp = tmp_;
}
public String getTmp(){
return this.tmp ;
}
}
class myClass{
public pp a ;
public pp b ;
public pp getA(){
return a;
}
public pp getB(){
return b;
}
public void setA(pp a_){
this.a = a_;
}
public void setB(pp b_){
this.b = b_;
}
}
public class test {
static{
System.loadLibrary("c-so-jni");
}
public native void fun(myClass param);
public native void myprintf();
public static void main(String[] args) {
test obj = new test();
//obj.myprintf();//just for test jni.
myClass param = new myClass();
param.a = new pp(); param.a.tmp="aaa";
param.b = new pp(); param.b.tmp="bbb";
obj.fun(param);
}
}
------------------------------ javah -jin test 生成test.h ----------------------------------
test.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class test */
#ifndef _Included_test
#define _Included_test
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: test
* Method: fun
* Signature: (LmyClass;)V
*/
JNIEXPORT void JNICALL Java_test_fun
(JNIEnv *, jobject, jobject);
/*
* Class: test
* Method: myprintf
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_test_myprintf
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
---------------------------------- 建立C Manage Project ,类型选择Share Library----------------
c-so-jni.h
#ifndef CSOJNI_H_
#define CSOJNI_H_
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class test */
#ifndef _Included_test
#define _Included_test
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: test
* Method: fun
* Signature: (LmyClass;)V
*/
JNIEXPORT void JNICALL Java_test_fun
(JNIEnv *, jobject, jobject);
/*
* Class: test
* Method: myprintf
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_test_myprintf
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
#endif /*CSOJNI_H_*/
----------------------------c-so-jni.c------------------------------------------------
#include "c-so-jni.h"
JNIEXPORT void JNICALL Java_test_fun
(JNIEnv *env, jobject obj, jobject param){
//在这里我如何得到myClass 对象param的各个属性?
//并且修改他们后传回给java程序?
jclass cls = (*env)->FindClass(env,"myClass");
// get myClass.a
jfieldID fid = (*env)->GetFieldID(env,cls,"a","Lpp;");
jobject pro = (*env)->GetObjectField(env,param,fid);
// get myClass.a
jmethodID mid_getA = (*env)->GetMethodID(env,cls,"getA","()Lpp;");
jobject ppObj = (jobject)(*env)->CallObjectMethod(env,param,mid_getA);
//get pp.tmp
jclass pp_cls = (*env)->FindClass(env,"pp");
// jmethodID mid_getTmp =(*env)->GetMethodID(env,pp_cls,"getTmp","()Ljava/lang/String;");
// jstring tmpstr =(jstring) (*env)->CallObjectMethod(env,pro,mid_getTmp);
jfieldID fid_pp_tmp = (*env)->GetFieldID(env,pp_cls,"tmp","Ljava/lang/String;");
jstring pptmp = (jstring)(*env)->GetObjectField(env,pro,fid_pp_tmp);
char * str =(char*) (*env)->GetStringUTFChars(env,pptmp,NULL);
printf("fun myclass.a.tmp=[%s]\n",str);
}
JNIEXPORT void JNICALL Java_test_myprintf
(JNIEnv * env, jobject obj){
printf("hello");
}
---------------------------------over -----------------------------------------
在最后的c-so-jni.c中,实现了,取得java对象,获得其属性.
的方法.
也可以获得java对象,调用它的方法.
c-so-jni.c中施用的类型例如,()Ljava/lang/String;可施用java明令获得.
例如,javap -s -public pp
javap -s -public myClass
------------ 输出如下:---------------
[shirx@localhost bin]$ javap -s -public myClass
Compiled from "test.java"
class myClass extends java.lang.Object{
public pp a;
Signature: Lpp;
public pp b;
Signature: Lpp;
public pp getA();
Signature: ()Lpp;
public pp getB();
Signature: ()Lpp;
public void setA(pp);
Signature: (Lpp;)V
public void setB(pp);
Signature: (Lpp;)V
}
[shirx@localhost bin]$ javap -s -public pp
Compiled from "test.java"
class pp extends java.lang.Object{
public java.lang.String tmp;
Signature: Ljava/lang/String;
public void setTmp(java.lang.String);
Signature: (Ljava/lang/String;)V
public java.lang.String getTmp();
Signature: ()Ljava/lang/String;
}
分享到:
相关推荐
当涉及到Android调用JNI并返回自定义对象时,这个过程比简单的数据类型传递更为复杂,但同时也提供了更大的灵活性。 首先,我们需要理解JNI的基本结构。在Android项目中,JNI代码通常被包含在`src/main/jni`目录下...
本示例"android jni 传递对象的demo"聚焦于一个特定的应用场景:在Java层和C/C++层之间传递对象。 首先,我们要理解在Java和C/C++之间传递对象的挑战。Java对象在JVM(Java虚拟机)中以引用的形式存在,而C/C++则不...
JNI编程中,还应注意到JNI的垃圾收集机制,当在本地代码中创建Java对象时,这个对象也会被垃圾收集器管理。因此,当不再需要时,本地代码应正确地进行资源释放。同时,JNI还提供了直接访问Java类字段和方法的函数,...
3、实例三、在jni函数中访问java类中的对象实例域... 58 4、实例四:在jni函数中访问类的静态实例域... 60 5、实例五:在jni函数中调用java对象的方法... 60 6、实例六:在jni函数中调用java类的静态方法... 61 ...
实例可能涉及如何传递Java对象到本地代码,然后在本地代码中调用其方法或修改其属性。 四、注意事项 - **内存管理**:JNI中的内存分配和释放必须由开发者自己管理,避免内存泄漏。 - **线程安全**:如果JNI函数在多...
`JNIEnv *env`是JNI环境指针,`jobject`是Java对象的指针,`NewStringUTF`是创建Java字符串的方法。 现在,我们需要配置NDK(Native Development Kit)来编译C/C++代码。确保已经安装了Android NDK,并在Eclipse的...
这通常涉及到定义Java方法的native属性,创建头文件(.h)使用`javah`工具,然后在C/C++代码中实现这些函数,最后通过`System.loadLibrary()`加载动态链接库。 `xxJNI_ch03_CToJava_ok.pdf`章节可能涉及反向过程,...
1. **创建、检查和更新Java对象**:JNI允许本地代码创建新的Java对象,检查对象的状态,以及修改对象的属性,包括数组和字符串。 2. **调用Java方法**:本地代码可以使用JNI调用Java类的方法,无论是静态方法还是...
`JNIEXPORT`是JNI的一个宏,用来指定导出函数的属性,而`JNICALL`是调用约定,确保参数传递方式与JVM兼容。函数接收两个参数,`JavaVM *`指向JVM的指针,`void *`通常是保留给实现特定用途的,例如传递额外的上下文...
这里,`JNIEXPORT`和` JNICALL`是JNI定义的宏,用于指定导出函数的链接属性和调用约定。`JNIEnv*`指向一个结构体,包含了指向Java环境和对象的指针。`jobject`是Java对象的指针。 4. **编译C代码**:使用合适的...
本篇文档《JNI本地方法访问Java端的属性和方法共9页》将深入探讨如何通过JNI来访问和操作Java对象的属性以及调用Java方法。 首先,了解JNI的基本概念是至关重要的。JNI提供了一组API,使得本地(非Java)代码可以与...
例如,你可以使用`NewObject`函数创建一个新的Java对象,然后使用`SetXXX`方法设置其属性。 3. **方法调用**:在C++中调用Java的方法,可以使用`CallVoidMethod`, `CallNonvirtualVoidMethod`, `...
可以使用`GetObjectClass`获取Java对象的类,`GetMethodID`获取方法ID,`GetFieldID`获取字段ID,然后通过这些ID来访问和修改对象的属性。 ### 异常处理 JNI提供了`Throw`, `ThrowNew`, `ExceptionOccurred`和`...
- **`Java_systemProcess_processData`**:遍历由`processHandle()`创建的快照,使用`Process32Next`函数获取每个进程的`PROCESSENTRY32`结构体,然后通过JNI接口向Java对象传递进程信息。 - **异常处理**:通过`...
注意,这里的`JNIEXPORT`和` JNICALL`是JNI的宏定义,用于指定导出函数的属性,`JNIEnv*`是一个指向JNI接口指针的指针,`jobject`是Java对象的类型。 6. **配置CMakeLists.txt**: 如果你的项目使用CMake作为构建...
1. **创建、检查及更新Java对象**:通过JNI,开发者可以在C/C++环境中创建Java对象,对其进行属性读写等操作。 2. **调用Java和非Java程序所编写的方法**:包括调用win32 API等。 3. **捕获和抛出“异常”**:实现了...
最后,在JNI方法中通过JNIEnv指针访问Java对象和调用Java方法,实现Java和C/C++之间的交互。 总结起来,【Eclipse JNI Demo】项目是一个典型的Android JNI开发示例,涵盖了从Java到C/C++的交互过程,展示了如何在...
在描述中提到的“属性、方法、数组引用”,指的是Java对象可以通过JNI接口在本地代码中访问和操作,包括获取和设置字段值、调用方法以及处理Java对象的数组。 接下来,我们探讨NDK。NDK是一套工具集,允许开发者在...