Android JNI(四)————JNI_在由C语言编写的JNI本地函数中如何控制Java端的代码

第一步:java端代码

class JniTest {
	private int intField;

	public JniTest(int num) {
		intField = num;
		System.out.println("[java] JniTest(int num):intField = " + intField);
	}

	public int callByNative(int num) {
		System.out.println("[java] jniTest callByNative(int num)");

		return num;
	}

	public void callTest()
	{
		System.out.println("[java] JniTest callTest : intField = " + intField);
	}
}

public class JniFuncMain {
	private static int staticIntField = 300;

	static {
		System.loadLibrary("jnifunc");
	}

	public static native JniTest createJniObject();

	public static void main(String args[]) {
		System.out.println("[java] createJniObject()");
		JniTest jniObj = createJniObject();

		jniObj.callTest();
	}
}

第二步:生成函数原型头文件(略)

第三步:C++/C端代码(本例中为C++)

#include <jni.h>
#include <stdio.h>
#include "JniFuncMain.h"
/*
 * Class:     JniFuncMain
 * Method:    createJniObject
 * Signature: ()LJniTest;
 */
JNIEXPORT jobject JNICALL Java_JniFuncMain_createJniObject(JNIEnv *env, jclass clazz)
{

	jfieldID fid;
	jint staticIntField;
	jclass targetClass;
	jmethodID mid;
	jobject newObject;
	jint result;

	/*获取JniFuncMain类的staticIntField变量值*/
	fid = env->GetStaticFieldID(clazz,"staticIntField","I");
	staticIntField = env->GetStaticIntField(clazz,fid);
	printf("[cpp] JniFuncMain.staticIntField = %d\n",staticIntField);

	/* 查找生成对象的类*/
	targetClass = env->FindClass("JniTest");

	/*查找构造方法*/
	mid = env->GetMethodID(targetClass,"<init>","(I)V");

	/*生成JniTest对象*/
	printf("[cpp] create JniTest\n");
	newObject = env->NewObject(targetClass,mid,100);

	/*调用对象的方法*/
	mid = env->GetMethodID(targetClass,"callByNative","(I)I");
	result = env->CallIntMethod(newObject,mid,200);

	/*设置JniObject 对象的intField值*/
	fid = env->GetFieldID(targetClass,"intField","I");
	printf("[cpp] set JniTest intField = 200\n");
	env->SetIntField(newObject,fid,result);

	/*返回对象的引用*/

	return newObject;
}
	

总结:

一、通过JNI,获取成员变量值

1、查找含有待访问成员变量的JniFuncMain类的jclass值

2、获取staticIntField变量的ID值

fid = env->GetStaticFieldID(clazz,"staticIntField","I");

3、读取jclass与fieldid指定的成员变量的值

staticIntField = env->GetStaticIntField(clazz,fid);

二、生成对象

1、查找生成对象的类

2、查找生成类的构造方法

3、生成JniTest类对象(返回对象引用)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编写C语言对应的JNI函数,用于与C代码进行交互,可以按照以下步骤进行: 1. 在Java代码声明native方法:首先,在Java声明一个native方法,该方法将与C代码进行对应。使用`native`关键字来标记这个方法,告诉编译器这个方法的实现在本地代码。 ```java public class MyNativeClass { public native void myNativeMethod(); } ``` 2. 生成头文件:在命令行或终端,使用`javac`命令编译Java类,并使用`javah`命令生成对应的头文件。头文件将包含与C代码交互所需的JNI函数声明。 ```shell javac MyNativeClass.java javah -jni MyNativeClass ``` 这将生成一个名为`MyNativeClass.h`的头文件。 3. 实现JNI函数:打开生成的头文件`MyNativeClass.h`,其包含了与C代码交互所需的JNI函数声明。在C源代码文件实现这些JNI函数。 ```c #include "MyNativeClass.h" JNIEXPORT void JNICALL Java_MyNativeClass_myNativeMethod(JNIEnv *env, jobject obj) { // 在这里实现与C代码的交互逻辑 // ... } ``` 4. 编译C代码:将C源代码文件和JNI头文件一起编译成共享库(动态链接库)文件。具体的编译命令可能因操作系统和编译器而异。 ```shell gcc -c MyNativeClass.c -o MyNativeClass.o gcc -shared -o libMyNativeClass.so MyNativeClass.o ``` 这将生成一个名为`libMyNativeClass.so`的共享库文件,可供Java代码加载和使用。 5. 在Java代码加载共享库:在Java代码使用`System.loadLibrary()`方法加载生成的共享库,以便在运行时加载C代码。 ```java public class MyNativeClass { static { System.loadLibrary("MyNativeClass"); } public native void myNativeMethod(); } ``` 现在,你可以在Java代码调用`myNativeMethod()`方法,它将执行与C代码实现的JNI函数交互。 请注意,JNI的使用需要一定的C语言Java语言的知识。确保你熟悉JNI的基本概念和语法,以便正确地进行数据传递和交互。 希望这些信息对你有所帮助!如果你需要进一步指导,请提供更多的具体细节或代码示例,我将尽力提供更详细的建议。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值