欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android JNI c/c++调用java的实例

程序员文章站 2022-08-08 09:59:30
android jni c/c++调用java的实例 近期通过研究sdl源码 得出android jni  c/c++调用java 无需新建虚拟机,这样省去很多...

android jni c/c++调用java的实例

近期通过研究sdl源码 得出android jni  c/c++调用java 无需新建虚拟机,这样省去很多步骤,这样调用android jni会变得非常容易,大家看下简单实例:

具体步骤如下

第一步获得:两个参数 jnienv和jclass

void java_com_test_audio_init( jnienv* env,jclass cls, jobject thiz ) 
{ 
 initjni(env,cls); 
} 
bool initjni(jnienv* env,jclass cls) 
{ 
 m_env=env; 
 m_cls=cls;  
} 

第二步

获得java那边定义的函数的名字

jmethodid midcreateglcontext = env->getstaticmethodid(cls,"test_audio","([b)z"); 
midcreateglcontext = m_env->getstaticmethodid(m_cls,"test_audio","([b)z"); 
midinitsound=m_env->getstaticmethodid(m_cls,"init","()v"); 
midloadsound=m_env->getstaticmethodid(m_cls,"load","(ljava/lang/string;i)v"); 
midloadmedia=m_env->getstaticmethodid(m_cls,"load","(ljava/lang/string;)v"); 

ava类型      对应的签名
boolean z
byte b
char c
shrot s
int i
long l
float f
double d
void v
object l用/分割包的完整类名;  ljava/lang/string;
array [签名       [i       [ljava/lang/string;

第三步 传递参数调用java 函数

char *str="god_is_a_girl.mp3"; 
char str[]="nihao"; 
 jbyte *by = (jbyte*)str; 
 jbytearray jarray = m_env->newbytearray(strlen(str)); 
 m_env->setbytearrayregion(jarray, 0, strlen(str), by); 
///调用java函数 
 m_env->callstaticbooleanmethod(m_cls, midcreateglcontext,jarray); 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!