在NDK C++线程中如何调用JAVA API
from://http://www.eoeandroid.com/thread-150995-1-1.html
在NDK中创建的线程中, 只允许调用静态的Java API. 当在线程中调用env->FindClass(), 系统就会发出异常.
http://android.wooyd.org/JNIExample中有较详细的调用说明.
示例代码如下:
JAVA 代码:
public class simple_test extends Activity {
...
public static void PrintNdkLog(String slog) {
Log.e("NDK", slog);
}
}
C++ 代码:
static JavaVM* g_JavaVM = NULL;
static jobject g_InterfaceObject = 0;
static void GetInterfaceObject(JNIEnv *env, const char *path, jobject *objptr) {
jclass cls = env->FindClass(path);
if(!cls) {
return;
}
jmethodID constr = env->GetMethodID(cls, "<init>", "()V");
if(!constr) {
return;
}
jobject obj = env->NewObject(cls, constr);
if(!obj) {
return;
}
(*objptr) = env->NewGlobalRef(obj);
}
int JniLoad(JavaVM* jvm, void* reserved)
{
g_JavaVM = jvm;
JNIEnv *env;
if (jvm->GetEnv((void**) &env, JNI_VERSION_1_6) != JNI_OK) {
return -1;
}
GetInterfaceObject(env, "com/myndk/simple_test", &g_InterfaceObject);
return JNI_VERSION_1_6;
}
void JniUnLoad(JavaVM* jvm, void* reserved)
{
JNIEnv *env;
if (jvm->GetEnv((void**) &env, JNI_VERSION_1_6) != JNI_OK) {
return;
}
env->DeleteGlobalRef(g_InterfaceObject);
}
void PrintNdkLog(const char *format, ...)
{
va_list arg_ptr;
char sLogBuff[1024];
va_start(arg_ptr, format);
vsprintf(sLogBuff, format, arg_ptr);
va_end(arg_ptr);
if (g_JavaVM == NULL)
return;
int status;
JNIEnv *env = NULL;
bool isAttached = false;
status = g_JavaVM->GetEnv((void**) &env, JNI_VERSION_1_6);
if(status < 0)
{
status = g_JavaVM->AttachCurrentThread(&env, NULL);
if(status < 0)
{
return;
}
isAttached = true;
}
jclass cls = env->GetObjectClass(g_InterfaceObject);
if (cls != 0)
{
jmethodID mid = env->GetStaticMethodID(cls, "PrintNdkLog", "(Ljava/lang/String;)V");
if (mid != 0)
{
jstring jstrMSG = env->NewStringUTF(sLogBuff);
env->CallStaticVoidMethod(cls, mid, jstrMSG);
}
}
if (isAttached) // From native thread
{
g_JavaVM->DetachCurrentThread();
}
}
在NDK C++线程中如何调用JAVA API的更多相关文章
- Java多线程--线程及相关的Java API
Java多线程--线程及相关的Java API 线程与进程 进程是线程的容器,程序是指令.数据的组织形式,进程是程序的实体. 一个进程中可以容纳若干个线程,线程是轻量级的进程,是程序执行的最小单位.我 ...
- Unity在Android和iOS中如何调用Native API
本文主要是对unity中如何在Android和iOS中调用Native API进行介绍. 首先unity支持在C#中调用C++ dll,这样可以在Android和iOS中提供C++接口在unity中调 ...
- 8.算法竞赛中的常用JAVA API :Calendar日期类
8.算法竞赛中的常用JAVA API :Calendar日期类 摘要 在蓝桥杯中有关于日期计算的问题,正好java中的Date类和Calendar类提供了对日期处理的一些方法.Date类大部分方法已经 ...
- 7.算法竞赛中的常用JAVA API :String 、StringBuilder、StringBuffer常用方法和区别(转载)
7.算法竞赛中的常用JAVA API :String .StringBuilder.StringBuffer常用方法和区别 摘要 本文将介绍String.StringBuilder类的常用方法. 在j ...
- 算法竞赛中的常用JAVA API :大数类(转载)
5.算法竞赛中的常用JAVA API :大数类 摘要 java中的基础数据类型能存储的最大的二进制数是 2 ^ 63 - 1 对应的十进制数是9223372036854775807(long类型的最大 ...
- eclipse 中使用中文JAVA api文档
http://hi.baidu.com/danghj/item/7625a1be20946e43ba0e1202在eclipse中使用中文JAVA api文档Sun 官方的中文版 Java API 文 ...
- 算法竞赛中的常用JAVA API:PriorityQueue(优先队列)(转载)
算法竞赛中的常用JAVA API:PriorityQueue(优先队列) PriorityQueue 翻译过来就是优先队列,本质是一个堆, 默认情况下堆顶每次都保留最小值,每插入一个元素,仍动态维护堆 ...
- 算法竞赛中的常用JAVA API :HashSet 和 TreeSet(转载)
算法竞赛中的常用JAVA API :HashSet 和 TreeSet set set容器的特点是不包含重复元素,也就是说自动去重. HashSet HashSet基于哈希表实现,无序. add(E ...
- 算法竞赛中的常用JAVA API :HashMap 和 TreeMap(转载)
算法竞赛中的常用JAVA API :HashMap 和 TreeMap 摘要 本文主要介绍Map接口下的HashMap和TreeMap. HashMap HashMap是基于哈希表的 Map 接口的实 ...
随机推荐
- org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from URL
[报错] org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XM ...
- Ibatis.Net 执行存储过程学习(八)
首先在数据库创建存储过程: create proc [dbo].[usp_GetPersonById] @Id int as begin select Id,Name from Person wher ...
- java 捕获所有异常
1.) 通过捕获异常类型的基类Exception就可以处理所有类型的异常.(事实上还有其它的基类,但Exception是同编程活动相关的基类) 2.)因为Exception是与编程有关的所有异常类的基 ...
- 【LOJ】#2183. 「SDOI2015」序列统计
题解 这个乘积比较麻烦,转换成原根的指数乘法就相当于指数加和了,可以NTT优化 注意判掉0 代码 #include <bits/stdc++.h> #define fi first #de ...
- zabbix3.4+grafana5.0.1数据可视化
转自:https://blog.csdn.net/xiaoying5191/article/details/79530280
- 007 @CookieValue绑定请求中的cookie
1.介绍 2.使用的cookie 3.index.jsp <%@ page language="java" contentType="text/html; char ...
- 关于我学XSS躺过的那些坑
XSS字符编码 在学习编码绕过时由于数量多,类型相似,不太容易记得住,记得全,故做此记录. 0x01 Html标签属性中执行 简单了解: Html标签属性中的XSS问题多属于javascript伪协议 ...
- SpringBoot详细研究-04部署测试与监控
这部分的内容实际就是devops的主要工作内容,当然一名合格的程序要也需要掌握这部分的知识. 热部署 简单来说,在开发时,修改了任何的代码,IDE将自动编译运行及发布:在发布时,当前发布不影响线上服务 ...
- Java对epub电子书类型切割
Epub电子书切割 引言:由于公司存储电子书的格式是.epub.一本电子书加载的时候,如果电子书大的话,全部加载该电子书会非常的消耗时间和资源.非常的不合理.那么现在,将所有电子书按章切分.将拆分的电 ...
- 使用djcelery发送邮件
发送邮件作为一个独立的业务模块,我们把它放到另外一个文件中,定义一个task文件,里面定义发送邮件的功能, 需要用到django.core.mail 里面的send_mail这个函数 发送邮件与网络环 ...