Android Jni开发之交互处理


jni中应用层和native层是怎样交互呢?关于jni的用法我们可以参照http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/jniTOC.html。下面用一个小例子来说明,java和c++的交互,主要讲三部分,对字符串、数组的处理和c++回调java函数。

字符串的处理

在Java类中声明native接口

//交互处理之字符串的处理
	public static native void modifyFile(String path);
在jni中.cpp文件中添加相应的c++实现:

JNIEXPORT void JNICALL Java_com_vince_jnidemo_MainActivity_modifyFile
  (JNIEnv *env, jclass jclas, jstring path){

	const char* file_path = env->GetStringUTFChars(path,NULL);//进行类型转换,jstring->char*
	if(file_path != NULL){
		LOGV("file_path in c %s",file_path);
	}

	//打开文件
	FILE* file = fopen(file_path,"a+");
	if(file != NULL){
		LOGV("open file success in c");
	}

	//写入文件
	char data[]="hello jni";
	int count = fwrite(data,strlen(data),1,file);
	if(count > 0){
		LOGV("write file success in c");
	}

	//关闭文件
	if(file != NULL){
		fclose(file);
	}

	//释放资源
	env->ReleaseStringUTFChars(path,file_path);
}
数组的处理
native的接口实现中对于数组有两种处理方案:
1、第一种方式是生成native层的数组拷贝
2、第二种方式是直接调用数组指针进行操作

在Java类中声明native接口

//交互处理之数组处理
	public static native int[] modifyIntArray(int[] data);
在jni中.cpp文件中添加相应的c++实现:

JNIEXPORT jintArray JNICALL Java_com_vince_jnidemo_MainActivity_modifyIntArray
  (JNIEnv *env, jclass jclas, jintArray array){

	//通过生成native层的数组拷贝操作数组

	jint nativeArray[5];
	env->GetIntArrayRegion(array, 0 , 5, nativeArray);

	int j;
	for(j = 0; j < 5; j++){
		nativeArray[j] += 5;
		LOGV("nativeArray--->  %d", nativeArray[j]);
	}

	env->SetIntArrayRegion(array, 0, 5, nativeArray);

	/*
	//通过生成native层的数组拷贝操作数组
	jint* data = env->GetIntArrayElements(array,NULL);//生成对应的指针
	jsize len = env->GetArrayLength(array);//获取到长度
	int j;
	for(j = 0; j< len; j++){
		data[j] += 3;
		LOGV("data from c %d",data[j]);
	}

	//释放资源
	env->ReleaseIntArrayElements(array,data,0);
    */
	return array;
}
native回调java函数
在Java类中声明native接口

//交互处理之从native中调用java层函数
	public static native void callJavaMethodFromNative();
在jni中.cpp文件中添加相应的c++实现:

JNIEXPORT void JNICALL Java_com_vince_jnidemo_MainActivity_callJavaMethodFromNative
  (JNIEnv *env, jclass jclas){

	jmethodID java_method = env->GetStaticMethodID(jclas, "printInfo", "()V");
	 if (java_method == NULL)
	 {
		 LOGV("java_method为空");
	 }
	env->CallStaticVoidMethod(jclas,java_method);
}

看了这么你可能会问,这么多函数从哪里查找,我们可以从E:\java\android-ndk-r9d\platforms\android-14\arch-arm\usr\include\jni.h中查看相应的函数。

jniDemo地址: http://download.csdn.net/detail/u012350993/9426813


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Studio 中进行 JNI(Java Native Interface)开发的流程如下: 1. 创建新的 Android 项目或打开现有项目。 2. 在项目的 `app` 模块下创建 `jni` 文件夹。可以右键点击 `app` 模块,选择 "New" -> "Folder" -> "JNI Folder"。 3. 在 `jni` 文件夹中创建一个新的 C/C++ 文件,例如 `native-lib.cpp`。 4. 在 `native-lib.cpp` 文件中编写您的 C/C++ 代码,可以与 Java 代码进行交互。 5. 打开 `CMakeLists.txt` 文件,它位于 `app` 模块的根目录中。如果没有该文件,则可以创建一个。 6. 在 `CMakeLists.txt` 文件中添加以下内容: ```cmake # 添加自动生成的 C/C++ 头文件 include_directories(src/main/cpp) # 添加你的 C/C++ 源文件 add_library(native-lib SHARED src/main/cpp/native-lib.cpp) ``` 7. 在 `MainActivity.java`(或您想要使用 JNI 的任何其他类)中,添加以下代码来加载和调用本地库: ```java static { System.loadLibrary("native-lib"); } // 调用本地方法示例 public native String yourNativeMethod(); ``` 8. 点击顶部菜单栏的 "Build" -> "Make Project" 来构建项目。 9. 如果一切顺利,您就可以在您的 Java 代码中调用您定义的本地方法了。 请注意,这只是一个简单的 JNI 开发流程示例。在实际开发中,您可能还需要处理类型转换、异常处理等其他细节。同时,您还需要了解更多关于 JNI 的知识,例如如何在 Java 和 C/C++ 之间传递数据、使用 JNI 的限制和最佳实践等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值