关于Android中JNI开沟机使用中常见问题的两个问题?

Pages: 1/2
主题 : 引擎提供的JNI 对 Android 5.0 不支持 ,该如何解决
可可豆: * CB
威望: * 点
在线时间: (时)
注册时间: *
最后登录: *
发自: Web Page
来源于&&分类
引擎提供的JNI 对 Android 5.0 不支持 ,该如何解决&&&
如题:********** Crash dump: **********Build fingerprint: 'google/razor/flo:5.0.2/LRX22G/1649326:user/release-keys'pid: 24442, tid: 24470, name: GLThread 1367&&&&& com.jaeger.sanguo.mi &&&signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------Stack frame #00 pc 0003a46c&&/system/lib/libc.so (tgkill+12)Stack frame #01 pc 00016af5&&/system/lib/libc.so (pthread_kill+52)Stack frame #02 pc &&/system/lib/libc.so (raise+10)Stack frame #03 pc 00013f75&&/system/lib/libc.so (__libc_android_abort+36)Stack frame #04 pc 00012a3c&&/system/lib/libc.so (abort+4)Stack frame #05 pc &&/system/lib/libart.so (art::Runtime::Abort()+170)Stack frame #06 pc 000a72e9&&/system/lib/libart.so (art::LogMessage::~LogMessage()+1360)Stack frame #07 pc 000b1401&&/system/lib/libart.so (art::JniAbort(char const*, char const*)+1112)Stack frame #08 pc 000b1945&&/system/lib/libart.so (art::JniAbortF(char const*, char const*, ...)+68)Stack frame #09 pc 000b2781&&/system/lib/libart.so (_ZN3art11ScopedCheck8CheckSigEP10_jmethodIDPKcb.constprop.131+284)Stack frame #10 pc 000b9e01&&/system/lib/libart.so (art::CheckJNI::CallStaticObjectMethodV(_JNIEnv*, _jclass*, _jmethodID*, std::__va_list)+72)Stack frame #11 pc 001f9fc8&&/data/app/com.jaeger.sanguo.mi-2/lib/arm/libcocos2dlua.so (_JNIEnv::CallStaticObjectMethod(_jclass*, _jmethodID*, ...)+60): Routine CallStaticObjectMethod in (null):0Stack frame #12 pc 001fadfc&&/data/app/com.jaeger.sanguo.mi-2/lib/arm/libcocos2dlua.so (AnnouncementManager::showAnnouncementView(cocos2d::CCString*, cocos2d::CCRect)+392): Routine showAnnouncementView in jni/../../Classes/announcement/AnnouncementManager.cpp:78Stack frame #13 pc &&/data/app/com.jaeger.sanguo.mi-2/lib/arm/libcocos2dlua.so: Routine tolua_JZJCocos2d_AnnouncementManager_showAnnouncementView00 in jni/../../Classes/lua_support/JZJLuaCocos2d.cpp:7300Stack frame #14 pc &&/data/app/com.jaeger.sanguo.mi-2/lib/arm/libcocos2dlua.so: Unable to locate routine information for address 449450 in module /Users/chenguangwen/svn/cocos2d-x-2.2.2/projects/SanGuoGame/proj_mi.android/obj/local/armeabi/libcocos2dlua.soStack frame #15 pc &&/data/app/com.jaeger.sanguo.mi-2/lib/arm/libcocos2dlua.so (lua_pcall+68): Unable to locate routine information for address 456654 in module /Users/chenguangwen/svn/cocos2d-x-2.2.2/projects/SanGuoGame/proj_mi.android/obj/local/armeabi/libcocos2dlua.so
级别: 新手上路
可可豆: 13 CB
威望: 13 点
在线时间: 14(时)
发自: Web Page
通过cocos2dx 调用的jni 会报错
图片:QQ图片09.png
级别: 侠客
UID: 325305
可可豆: 802 CB
威望: 795 点
在线时间: 302(时)
发自: Web Page
回 1楼(liuzuoshuang) 的帖子
bool isHave = JniHelper::getStaticMethodInfo(t,PACKAGENAME,&isNetworkConnected&,&()Z&);&&&&if (isHave)&&&&{&&&&&&&&isHave = t.env-&CallbooleanMethod(t.classID, t.methodID);&&&&&&&&t.env-&DeleteLocalRef(t.classID);&&&&&&&&CCLOG(&isNetwork Method is Success&);&&&&}试下看看,换成你的函数的返回类型。
级别: 骑士
UID: 369615
可可豆: 1043 CB
威望: 770 点
在线时间: 372(时)
发自: Web Page
升级你的cocos2dx的版本
级别: 侠客
UID: 311784
可可豆: 1338 CB
威望: 787 点
在线时间: 367(时)
发自: Web Page
原本正常的程序装到5.0手机上就直接崩了,用的3.2版本。暂时还没时间研究,听说整个机制都改了。升级引擎比较麻烦,不知道3.2的还会不会更新
级别: 新手上路
可可豆: 101 CB
威望: 91 点
在线时间: 33(时)
发自: Web Page
回 4楼(trackway) 的帖子
不行就尝试把jnihelper.cpp里的代码,全从网络上copy一份今天我也遇到一个这样的问题,看起来类似但是我这里主要原因,做了开启启动功能,在activity没跑起来之前,就使用到了c++调用java最后发现是因为JniHelper内 setClassLoaderFrom 方法没有调用,就是Context没设置过,没办法初始loader
级别: 新手上路
可可豆: 101 CB
威望: 91 点
在线时间: 33(时)
发自: Web Page
只升级JniHelper其实代码变动不大,只添加了一个方法
级别: 侠客
UID: 311784
可可豆: 1338 CB
威望: 787 点
在线时间: 367(时)
发自: Web Page
回 5楼(keenn) 的帖子
谢谢回复。不过我把项目升级到3.6了,ndk也使用了R10版本,目前在android 5.0可正常运行
级别: 新手上路
可可豆: 3 CB
威望: 3 点
在线时间: 4(时)
发自: Web Page
回 5楼(keenn) 的帖子
对的,还好看到你的回复,要不就得麻烦的升级引擎了
级别: 新手上路
可可豆: 137 CB
威望: 137 点
在线时间: 102(时)
发自: Web Page
我试了2楼的,发现是可以的,只需要换成对应返回类型的方法调用就可以了。至少我把我项目中的都更新了之后就正常运行了
Pages: 1/2
关注本帖(如果有新回复会站内信通知您)
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 关注CVP公众号
扫一扫 浏览移动版今天看啥 热点:
Android NDK开发(三)——常见错误集锦以及LOG使用,androidndk
& & & & 转载请注明出处:http://blog.csdn.net/allen315410/article/details/&
& & & & Android NDK开发经常因某些因素会出现一些意想不到的错误,很多时候调试这些错误的时候,显得比调试Java代码要复杂,一方面是导致错误的原因很多很杂,另一方面NDK开发涉及到C/C++代码的编写,很多程序员对此不熟悉。那么这篇博客就总结一下,在NDK开发中经常出现的一些问题,并且尝试提供一些正确的解决方案,方便在开发时能够快速定位到错误,更改错误,当然了,错误是多种多样的,很难把所有的错误都总结出来,在这里仅作为一个笔记吧,以后在NDK开发中发现一个错误或者解决一个错误后,我就在这里记录一下,日积月累,就不错了!
常见错误及解决方法
1,Android.mk文件不存在
错误描述:Android NDK: Your APP_BUILD_SCRIPT points to an unknown file: ./jni/Android.mk &
& & & & & & & & & &/cygdrive/e/ndk/android-ndk-r10d/build/core/add-application.mk:199: *** Android NDK: Aborting... & &。 停止。
解决方法:报这个错误就需要查看一下工程目录下的jni目录下,是否有Android.mk文件,或者Android.mk文件名是否输入错误了。
2,Android.mk文件配置出错
错误描述:/cygdrive/e/ndk/android-ndk-r10d/build/core/build-shared-library.mk:23: *** Android NDK: Missing LOCAL_MODULE before including & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &BUILD_SHARED_LIBRARY in jni/Android.mk
& &。 停止。
解决方法:检查Android.mk文件配置信息。Missing LOCAL_MODULE表明LOCAL_MODULE配置出错,查看并修正。
3,C语言代码有错误
错误描述:[armeabi] Compile thumb &: Hello &= Hello.c
& & & & & & & & & & jni/Hello.c: In function 'Java_com_example_ndk_MainActivity_java_1From_1JNI':
& & & & & & & & & & jni/Hello.c:17:9: warning: division by zero [-Wdiv-by-zero]
& & & & & & & & & & int i=5/0;
& & & & & & & & & & & & & & & ^
& & & & & & & & & & [armeabi] SharedLibrary &: libHello.so
& & & & & & & & & & [armeabi] Install & & & &: libHello.so =& libs/armeabi/libHello.so
解决方法:C语言报错通常错误信息很多,我们可以根据cygwin上的LOG定位到错误。
4,Java代码中没有找到C代码库
错误描述:AndroidRuntime(1171): java.lang.UnsatisfiedLinkError: Couldn't load Hello1 from loader dalvik.system.PathClassLoader[DexPathList[[zip file &/data/app/com.example.ndk-1.apk&],nativeLibraryDirectories=[/data/app-lib/com.example.ndk-1,
/system/lib]]]: findLibrary returned null
解决方法:说明Java代码在加载C代码库的时候弄粗了C代码库的名称,请在java层中改正。
5,C代码函数签名错误
错误描述:java.lang.UnsatisfiedLinkError: Native method not found: com.example.ndk.MainActivity.java_From_JNI:()Ljava/lang/S
解决方法:Native method not found。这个应该不难吧,一看就知道是C语言中的函数签名出错了。
6,ndk版本问题
错误描述:Android NDK: WARNING: APP_PLATFORM android-19 is larger than android:minSdkVersion 8 in ./AndroidManifest.xml
& & & & & & & & & & [armeabi] Compile thumb &: Hello &= Hello.c
& & & & & & & & & & [armeabi] SharedLibrary &: libHello.so
& & & & & & & & & & [armeabi] Install & & & &: libHello.so =& libs/armeabi/libHello.so
解决方法:这只是一个警告而已,不处理的话程序也照样运行。导致这个警告的原因是当前ndk的版本&工程中minSdkVersion,想要去掉这个警告就将minSdkVersion支持的最小版本号改成ndk版本号一致,当然了这是愚蠢的做法,但是我们可以使用ndk的低版本编译,也不太好。下面是个好的解决方法:
1,在工程目录jni下建立一个新的文件,文件名是 Application.mk
2,在Application.mk文件里加上这样的一句:
APP_PLATFORM := android-8
3,保存工程,编译一下,就看见这个警告没有了。
7,使用javah命令生成函数签名时,找不到class文件
错误描述:错误: 无法访问android.app.Activity
& & & & & & & & & & & & & & & 找不到android.app.Activity的类文件
解决方法:这个错误的具体原因应该没有找到对应的native方法所在的Java字节码文件,但是我这里确实路径是正确,还是报错了,很奇怪,不知道是不是Eclipse上的一个BUG。遇到这个问题时,可以这样解决,既然切换到\bin\classes目录下不行的话,那就切换到工程目录\src目录,再javah一下,这次居然生成了.h的头文件,不知道为什么这样,反正我测试的时候可行。
tip:获得本地方法头文件&
jdk6.0:在Android工程的bin\classes目录下执行:javah 包名+类名
jdk7.0:在Android工程的src目录下执行:javah 包名+类名
8,中文乱码问题
错误描述:ndk开发中经常会在C语言代码中往Java代码返回一个中文字符串,偶尔在Java中调用的时候,程序结果会出现中文乱码情况,或者更有甚者导致程序直接崩溃掉,查看Log日志也是说明出现乱码的情况。
解决方法:
& & & & &中文乱码的原因是英文C语言文件保存的格式不是UTF-8的格式,或者整个工程都不是UTF-8的格式,因为C语言jni传递字符串时采用的UTF-8编码,这一点可以在(*env)-&NewStringUTF(env, &hello jni!&)看出,NewStringUTF(env,char*)这个方法说明返回的是UTF-8编码形式的字符串。所以我们在建立工程的时候,或者新建一个C语言代码文件的时候,需要指定工程编码为UTF-8或者C语言代码文件的保存格式是UTF-8。
9,编码GBK的不可映射的字符
错误描述:编码GBK的不可映射字符。
解决方法:引起这个错误的原因是使用javah时没有指定java的编码集,这种情况下编译器自动根据windows默认的编码(GBK)编译,而Java支持UTF-8的编码集。解决这个问题的方法是在javah命令执行时为编译器指定一个编码集,使用javah命令的参数-encoding 编码集,如图
LOG日志的使用
& & & & 上面列举了一些ndk开发中经常会遇见的问题以及解决方法,但是唯独没有列出的,也是最常见的错误,就是C语言代码中出现错误,这个不太好解决,而且出现的问题是各种各样,具体情况具体对待。已知在使用Java开发Android程序时,Google为了方便程序员调试,在SDK中提供了LOG输出功能,程序员用来输出程序中的日志使用。那么庆幸的是,Google在NDK中也提供了类似的LOG机制,帮助native层代码错误的定位。下面就尝试一下使用这个LOG机制。
& & & &在ndk解压目录下platforms\android-8\arch-arm\usr\include\android有个log.h的头文件,这个log.h的头文件用来管理C语言代码中的LOG输出,代码如下:
#ifndef _ANDROID_LOG_H
#define _ANDROID_LOG_H
#include &stdarg.h&
#ifdef __cplusplus
extern &C& {
* Android log priority values, in ascending priority order.
typedef enum android_LogPriority {
ANDROID_LOG_UNKNOWN = 0,
ANDROID_LOG_DEFAULT,
/* only for SetMinPriority() */
ANDROID_LOG_VERBOSE,
ANDROID_LOG_DEBUG,
ANDROID_LOG_INFO,
ANDROID_LOG_WARN,
ANDROID_LOG_ERROR,
ANDROID_LOG_FATAL,
ANDROID_LOG_SILENT,
/* only for SetMinPriority(); must be last */
} android_LogP
* Send a simple string to the log.
int __android_log_write(int prio, const char *tag, const char *text);
* Send a formatted string to the log, used like printf(fmt,...)
int __android_log_print(int prio, const char *tag,
const char *fmt, ...)
#if defined(__GNUC__)
__attribute__ ((format(printf, 3, 4)))
* A variant of __android_log_print() that takes a va_list to list
* additional parameters.
int __android_log_vprint(int prio, const char *tag,
const char *fmt, va_list ap);
* Log an assertion failure and SIGTRAP the process to have a chance
* to inspect it, if a debugger is attached. This uses the FATAL priority.
void __android_log_assert(const char *cond, const char *tag,
const char *fmt, ...)
#if defined(__GNUC__)
__attribute__ ((noreturn))
__attribute__ ((format(printf, 3, 4)))
#ifdef __cplusplus
#endif /* _ANDROID_LOG_H */& & & & &上面的代码看不懂也没关系,我们只需要知道怎么用就行了。
1,在C语言代码中引用log.h的头文件,并且预定义LOG_TAG标记Tag名称,预定义输出规则:
2,用上面预定义的名称定义LOG输出的内容
#include&stdio.h&
#include&jni.h&
#include&com_example_ndk_MainActivity.h&
#include &android/log.h&
#define LOG_TAG &System.out.c&
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
JNIEXPORT jstring JNICALL Java_com_example_ndk_MainActivity_javaFromJNI(
JNIEnv* env, jobject obj) {
return (*env)-&NewStringUTF(env, &hello jni!&);
com_example_ndk_MainActivity
java_From_JNI
* Signature: ()Ljava/lang/S
JNIEXPORT jstring JNICALL Java_com_example_ndk_MainActivity_java_1From_1JNI(
JNIEnv* env, jobject obj) {
LOGI(&function called&);
LOGI(&array init&);
char c1[3] = { 'a', 'b', 'c' };
char c2[2] = { 'd', 'e' };
LOGI(&array init finish&);
LOGI(&copy array&);
strcat(c1, c2); //把c2的内容放在c1的后面,要求c1长度&c2长度
LOGI(&copy array finish&);
return (*env)-&NewStringUTF(env, &hello_jni__&);
}上述的代码中
#include &android/log.h&
#define LOG_TAG &System.out.c&
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)是必须添加的,告诉编译器这里需要输出LOG,LOG的TAG标记是“System.out.c”,并且预定义LOGD(...)代表Debug输出,LOGI(...)代表Info输出。然后在C语言主题代码中就可以使用LOGD和LOGI了,传递字符串就可以了,需要注意的是传递的字符串要用英文字符,不支持中文。
3,在Android.mk文件中配置LOG输出
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE
LOCAL_SRC_FILES := Hello.c
LOCAL_LDLIBS += -llog
include $(BUILD_SHARED_LIBRARY)注意:就一句&LOCAL_LDLIBS += -llog 就行了,但是必须得加在&include $(BUILD_SHARED_LIBRARY) 之前。
4,重新编译代码,运行看看效果
& & & & 好了,我们在Logcat里面过滤出来System.out.c的TAG,可以看到在输出copy array之后程序停止了,说明LOGI(&copy array&);下面的strcat(c1, c2);出现了错误,这里需要修改代码中的错误,程序才能正确执行,是不是很方便啊?试试吧!&
源码请在这里下载
相关搜索:
相关阅读:
相关频道:
Android教程最近更新2013年10月 移动开发大版内专家分月排行榜第三
2013年10月 移动开发大版内专家分月排行榜第三
2013年10月 移动开发大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
加载so的时候,System.loadLibrary(""); 函数能放在子线程进行吗?因为,放在主线程,发现有小概率发生ANR。
调用native方法能放在子线程吗?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
1.一般System.loadLibrary("");我会在静态块里面执行比如这样
System.loadLibrary("");
2.native方法是说的调用的时候吗?肯定是可以的,android的主线程是UI线程,非UI操作都能在子线程中完成
同步到新浪微博
分享到微博?
你好!看起来你挺喜欢这个内容,但是你还没有注册帐号。 当你创建了帐号,我们能准确地追踪你关注的问题,在有新答案或内容的时候收到网页和邮件通知。还能直接向作者咨询更多细节。如果上面的内容有帮助,记得点赞 (????)? 表示感谢。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:如何让Java和C++接口互相调用:JNI使用指南
如何让Java和C++接口互相调用:JNI使用指南
写在前面的话
对于cocos2d-x开发者而言,游戏对多平台的支持是一个刚需,一般而言需要支持Android和iOS。然而,在开发过程中,Android平台遇到的一系列问题着实让人头疼,本文以集成新浪微博分享SDK为例,从3个方面讲解Cocos2d-x在Android平台开发遇到的问题和解决方法。
ps. 如果你是新手,请先阅读
关于新浪SDK
目前微博SDK为开发者提供 Oauth2.0 Web 授权认证,并集成 SSO 登录功能。你可以在这里下载android版本的SDK:
在 'readme.md' 中,可以看到普通JAVA应用程序的集成方式,所以,Oauth2.0和如何申请AppKey等问题,我们就不再啰嗦。但是对于Cocos2d-x游戏而言,坑爹的问题就出现了:SDK是用Java实现,那我们怎样在C++程序中调用Java接口呢?
接下来主角就出现了:JNI
JNI是JVM实现中的一部分,因此Native语言和Java代码都运行在JVM的宿主环境。JNI的出现使得开发者既可以利用Java语言跨平台、类库丰 富、开发便捷等特点,又可以利用Native语言的高效。
JNI是一个双向的接口:开发者不仅可以通过JNI在Java代码中访问Native模块,还可以在 Native代码中嵌入一个JVM,并通过JNI访问运行于其中的Java模块。可见,JNI担任了一个桥梁的角色,它将JVM与Native模块联系起来,从而实现了Java代码与Native代码的互访。
缺点:由于Native模块的使用,Java代码会丧失其原有的跨平台性和类型安全等特性。但是这不是我们应该担心的,不是吗?哈哈
也就是说,JNI是帮助游戏在Java代码中调用Native接口和在Native代码中调用Java接口。
方法1. 基本使用
一般来说,要在Native代码中访问Java对象,有如下几个步骤:
得到该Java对象的类定义。JNI定义了jclass 这个类型来表示Java的类的定义,并提供了FindClass接口,根据类的完整的包路径即可得到其jclass 。
根据jclass 创建相应的对象实体,即jobject 。在Java中,创建一个新对象只需要使用new 关键字即可,但在Native代码中创建一个对象则需要两步:首先通过JNI接口GetMethodID得到该类的构造函数,然后利用NewObject接口构造出该类的一个实例对象。
访问jobject 中的成员变量或方法。访问对象的方法是先得到方法的Method ID,然后使用CallMethod 接口调用,这里Type对应相应方法的返回值——返回值为基本类型的都有相对应的接口,如CallIntMethod;其他的返回值(包括String) 则为CallObjectMethod。可以看出,创建对象实质上是调用对象的一个特殊方法,即构造函数。访问成员变量的步骤一样:首先 GetFieldID得到成员变量的ID,然后Get/SetField读/写变量值。
所以,Native端的登陆接口实现如下:
int WebAbility_WeiboLogin(const char *clientID, const char *redirector) {
*pEnv = getVMEnvironment();
jclass JavaC
JavaClass = (*pEnv)-&FindClass(pEnv,"com/Tyran/weiboSDK");
jmethodID methId = getMethodID(pEnv,JavaClass,"WeiboLogin", JNI_TRUE);
jstring idStr = (*pEnv)-&NewString(pEnv,clientID, getUcsLen(clientID));
jstring redirectorStr = (*pEnv)-&NewString(pEnv,redirector, getUcsLen(redirector));
(*pEnv)-&CallStaticVoidMethod(JavaClass, methId,idStr,redirectorStr);
return JNI_TRUE;
}要注意的地方:
FindClass要写明Java类的完整包路径,并将 “.”以“/”替换;
GetMethodID的第三个参数是方法名(对于构造函数一律用“”表示),第四个参数是方法的“签 名”,需要用一个字符串序列表示方法的参数(依声明顺序)和返回值信息。
同样的,我们需要在java端创建一个登陆接口,用于调用验证框的webview:
public static void WeiboLogin(String clientID, String redirector) {
Url = HEAD_URL + CLIENT_ID + clientID + RESPONSE_TYPE + REDIRECT_URI
redirectorStr =
Intent i = new Intent(LaunchActivity.getInstance(),
WebViewActivity.class);
LaunchActivity.getInstance().startActivity(i);
}这样,再继续实现webview相关接口,我们就能够调用微博的相关功能了,实现代码会开源出来,这里就不一一贴出来了。
以上是实现jni的基本方法,看起来很复杂,不是吗?所以Cocos2d-x对jni进一步封装了一次,可以实现更简单的调用方式。
方法2. jnihelper
2dx里面为我们提供了一个JniHelper类,来满足与Java层的数据交互,JniHelper可以很方便的调用java层的动静态方法。
使用步骤:
再使用JniMethodInfo的env调用执行Java的静态方法
getStaticMethodInfo,获取需要调用的java方法信息
最重要的两个方法:
getStaticMethodInfo、getMethodInfo
getStaticMethodInfo调用Java静态方法的方法:
getStaticMethodInfo(JniMethodInfo &methodinfo, const char *className, const char *methodName, const char *paramCode)
第一个参数为JniMethodInfo,为一个容器类,表示当前调用的方法
第二个参数为调用Java方法类的全名
第三个参数为调用java的方法名,也就是参数为方法的参数类型
java与Jni对应的参数类型如下:
对应的签名
Ljava/lang/String
Ljava/lang/String
第四个参数为返回类型
getMethodInfo类似与第一个函数,只是对应非静态函数;此函数主要用于获取Java定义的类非静态函数是否存在,返回bool;
此类型主要用户保存类结构体,可以通过JniHelper类的getStaticMethodInfo函数实例化JniMethodInfo对象,从而使用实例的env属性调用CallStaticVoidMethod,CallVoidMethod,CallStaticIntMethod等函数进行对保存的类结构调用函数;
示例代码:
JniMethodI
bool isHave = JniHelper::getStaticMethodInfo(t,
"com/weibo/test/WeiboHelper",
"()V");效果
工程中,我们简单复用新浪微博demo中的java代码,所以,弹出的webview效果如下:
虽然Jni在cocos2d-x android工程中的运用很广泛,但是Android项目中,Activity主线程跟c++层是不同的,两者分属不同线程,也就是说,Android的UI线程并不安全,通过Jni直接调用java层方法来做刷新界面等操作是极度危险的。所以在集成一些第三方支付SDK的时候应该非常小心。
沪ICP备号-5

我要回帖

更多关于 初中天平的使用问题 的文章

 

随机推荐