`

安卓中使用JNI

 
阅读更多

最近要调整一个工程,里面有用到JNI,做个笔记,环境为:Windows7+eclipse。

参考贴:

http://blog.csdn.net/shulianghan/article/details/18964835

 

过程:

1.down一个最简单的用到了JNI的工程

https://github.com/han1202012/NDKHelloworld.git

 

2.在上面的工程里加个批处理文件

 

 

常见问题:

1.include <string>缺提示找不到

解决办法:

http://stackoverflow.com/questions/10373788/c-unresolved-inclusion-iostream
 

2.从公司服务器down了一个工程,右键properties里有c++相关的部分,但是从网上down了一个工程,却看不到CDT插件的影子?这是为什么呢?

后来从公司的工程里拷贝了一个.project文件过来,就有了!细想一下,好像我电脑确实没装过CDT插件,估计这个.project文件里有什么东西。

 

3.程序莫名闪退,找了好久原因才发现,java代码中声明一个函数

native public static boolean sendMessageToOneMobile(String mobile,String msg);

c++中定义函数的时候,这前两个参数(JNIEnv *env,jobject thiz)一定要带上

因为调用的时候,实参是会传过去的!!!

JNIEXPORT bool JNICALL Java_shuliang_han_ndkhelloworld_MainActivity_sendMessageToOneMobile

(JNIEnv *env,jobject thiz,jstring mobile,jstring msg ){}

 

4.native读取java传递过来的String[],存储为char**

参考贴:

http://liuxp0827.blog.51cto.com/5013343/1378277 

 

JNIEXPORT void JNICALL Java_shuliang_han_ndkhelloworld_MainActivity_nativeSendMessageToMobiles(
JNIEnv *env,jobject thiz,jobjectArray mobiles,jstring msg ){
	jstring jstr;
	jsize arraysize = env->GetArrayLength(mobiles);
	const char **pstr = (const char **) malloc(arraysize*sizeof(char *));
	for (int i=0 ; i<arraysize; i++) {
		jstr = (jstring)env->GetObjectArrayElement(mobiles, i);
		pstr[i] = (char *)env->GetStringUTFChars(jstr, 0);
	}

	const char *nativemsg = env->GetStringUTFChars(msg, 0);
	DataTransDemo::sendMessageToMobiles(pstr,arraysize,nativemsg);

	env->ReleaseStringUTFChars(msg,nativemsg);
	for(int i=0;i<arraysize;i++){
		jstr = (jstring)env->GetObjectArrayElement(mobiles, i);
		env->ReleaseStringUTFChars(jstr,pstr[i]);
		env->DeleteLocalRef(jstr);
	}
	free(pstr);
}

 

 

5.native将char**装换成String[]传递给java

参考贴:

https://coderanch.com/t/326467/java/Returning-String-array-program-Java

http://zhiweiofli.iteye.com/blog/1830319 

 

bool DataTransDemo::sendMessageToMobiles(const char* mobiles[],const char* msg){
	SGJniMethodInfo t;
	bool bRlt = true;

	if (SGSDKJniHelper::getStaticMethodInfo(t, CLASS_NAME, "sendMessageToMobiles","([Ljava/lang/Object;Ljava/lang/String;)Z")) {
		SGLOGD("DataTransDemo::sendMessageToMobiles begin");

		jstring strMessage = t.env->NewStringUTF(msg);
		jobjectArray mobilearray;
		mobilearray= (jobjectArray)t.env->NewObjectArray(size,t.env->FindClass("java/lang/String"),NULL);
		for(int i=0;i<size;i++){
			jstring mobilestring = t.env->NewStringUTF(mobiles[i]);
			t.env->SetObjectArrayElement(mobilearray,i,mobilestring);
			t.env->DeleteLocalRef(mobilestring);
		}

		bRlt = t.env->CallStaticBooleanMethod(t.classID, t.methodID, mobilearray, strMessage);
		t.env->DeleteLocalRef(t.classID);
		t.env->DeleteLocalRef(strMessage);
		t.env->DeleteLocalRef(mobilearray);

		SGLOGD("DataTransDemo::sendMessageToMobiles ok");
	}else{
		SGLOGD("DataTransDemo::sendMessageToMobiles getStaticMethodInfo error");
		bRlt = false;
	}

	return bRlt;
}

 

 6.关于jni里释放资源

参考贴:http://iaiai.iteye.com/blog/2245785

  • 大小: 2.2 KB
分享到:
评论

相关推荐

    Android中使用jni进行本地开发

    本文将深入探讨在Android中使用JNI进行本地开发的相关知识点。 一、JNI基础概念 1. JNI接口:JNI定义了一套API,允许Java代码调用本地方法(C/C++),同时本地方法也可以调用Java方法。这些接口包括了各种数据类型...

    Android中使用JNI获得APK签名的哈希值

    本源代码是使用JNI获得APK签名的哈希值,先通过获取app的包名,判断该包名是否合法,然后再获取该包名的签名,判断是否合法.我们不能够用jni来判断签名是否合法,然后又回到java那里去,只能使用jni来编写核心代码.否则是...

    安卓中实现jni读取内存信息

    通过以上步骤,我们就实现了使用JNI在Android应用中读取内存信息的功能。这种方法可以让开发者更深入地了解设备状态,优化应用性能,或者解决特定场景下的问题。不过,需要注意的是,访问系统底层文件可能需要特定的...

    在Android中的jni里使用OpenGL ES和OpenCV渲染一幅图片

    在JNI中,可以创建一个简单的四边形(如一个矩形)作为渲染的目标,然后使用`glDrawArrays`或`glDrawElements`绘制这个四边形,将纹理贴图到其表面。这将在Android设备的屏幕上显示出处理过的图片。 此外,为了在...

    安卓使用jni的例子

    总结来说,这个“安卓使用jni的例子”展示了如何在Android应用中使用JNI来调用C/C++代码。通过这个过程,我们可以学习到JNI的基本原理,包括Java端的native方法声明、头文件的生成、C/C++的实现以及本地库的构建和...

    Android使用JNI调用Python so解释器

    在这个特殊的场景中,我们讨论的是如何通过JNI在Android应用中调用Python解释器,这通常用于实现动态脚本执行或者利用Python丰富的库资源。 首先,我们需要理解Android的NDK(Native Development Kit),它是...

    Android中使用JNI获得APK签名的哈希值例子

    上次发的代码: http://download.csdn.net/detail/iloveyoueveryday/6909583 好多人说调不通,于是做了个小例子,改了一些东西(其实还是一样的),给大家看看,要是还有问题,就说明是你的NDK环境没有设置好了

    android中使用jni对字符串加解密实现分析demo

    鉴于完全使用C/C++代码进行字符串的加解密,我们需要考虑不同系统平台上数据类型的差异问题,这里推荐另一种易于实现的方法,即使用Java中的AES加解密逻辑,而将AES加解密所需要的核心秘钥放入到C中,通过调用jni来...

    android-JNI

    这篇博客“android-JNI”可能是作者分享关于在Android中使用JNI的一些经验和技巧。 在Android应用开发中,JNI主要涉及到以下几个知识点: 1. **JNI基础**:JNI是Java平台的一部分,提供了一个框架,让Java代码可以...

    android下一个jni方式实现的音频播放

    通过这个示例,开发者不仅可以学习如何在Android中使用JNI进行音频播放,还可以了解Android音频系统的底层工作原理,这对于开发高质量的音乐应用或游戏至关重要。同时,它也是一个实践NDK编程、提高跨平台能力的良好...

    安卓串口Socket通讯USB驱动jni相关-Android中调用JNI例子.rar

    这个压缩包“安卓串口Socket通讯USB驱动jni相关-Android中调用JNI例子.rar”似乎包含了一个示例项目,展示了如何在Android应用中使用JNI来实现串口、Socket通信以及USB驱动的交互。以下将详细介绍这些知识点。 1. *...

    Android JNI多线程编程回调JAVA函数

    本话题将深入探讨如何在Android中使用JNI进行多线程编程,并实现native方法对Java函数的回调。 1. **JNI基础知识**: - JNI是Java平台的一部分,为Java应用程序提供了与本地代码交互的能力。开发者可以通过JNI在...

    AndroidStudio加载jni

    Android Studio作为官方推荐的Android开发环境,集成了对NDK(Native Development Kit)的支持,使得在Android应用中使用JNI变得更加方便。现在我们来详细探讨如何在Android Studio中加载和使用JNI。 首先,我们...

    android jni调用jni 方法

    本篇文章将深入探讨如何在Android中使用JNI以及如何在JNI层调用方法。 1. **JNI基本概念** - JNI是一种接口,让Java应用程序能够调用本地(非Java)代码,同时也允许本地代码调用Java方法。 - 在Android中,JNI...

    Android通过JNI调用.so动态库

    在编译完成后,我们可以在 Android 项目中使用 JNI 来调用.so 动态库中的 C/C++ 方法。 通过 JNI,我们可以在 Android 项目中调用.so 动态库中的 C/C++ 方法,实现与 native 代码的交互。这可以帮助我们实现更加...

    Android JNI 用C函数写本地库读写文件,底层调用小例子

    总结起来,这个示例展示了如何在Android中使用JNI和C语言实现文件的读写操作。通过这种方式,开发者可以充分利用C语言的性能优势,同时保持Java的易用性和跨平台性。在实际项目中,这可能用于处理大量数据、加密解密...

    android jni使用curl进行http请求和文件下载

    在本案例中,我们将讨论如何在Android JNI中使用libcurl库来执行HTTP请求和文件下载。 libcurl是一个流行的开源库,用于处理各种网络协议,包括HTTP、HTTPS等。它提供了丰富的API,可以在多种编程语言中使用,包括C...

    serial_jni_largestgle_Androidjni_Android串口操作JNI代码_android_

    `serial_jni_largestgle_Androidjni_Android串口操作JNI代码_android_`这个项目就是关于如何使用JNI来实现Android设备的串口读写的示例。 首先,我们需要了解JNI的概念。JNI是Java平台提供的一种接口,允许Java代码...

    Android--JNI-Device.zip_Android jni_android_jni_jni android

    在Android开发中,JNI(Java Native Interface)是一个关键的组件,它允许Java代码与其他语言(如C++或C)编写的代码进行交互。这个“Android--JNI-Device.zip”文件显然是一个关于Android平台上使用JNI与硬件设备...

Global site tag (gtag.js) - Google Analytics