android通过jni实现java与c/c++之间的交互。
jni主要分成2个部分使用:
- java代码调用c/c++的代码;
- c/c++调用java的对象函数;
先来讨论 ava代码调用c/c++的代码。java部分需要完成两个工作:
- 加载c/c++的动态库函数;
- native声明c/c++的函数。
如下所示:
public class SendSMS {
static
{
System.out.println(System.getProperty("java.library.path"));
System.loadLibrary("sms");
}
public native static int SmsInit();
public native static int UwLogin(object obj, String apSsid,String apBssid);
}
完成以上的java部分之后,就需要在jni接口文件中定义 出现在java中的native函数了。
jint Java_com_wlan_wifi_UwApi_UwLogin(JNIEnv *env, jobject obj,jstring apSsid, jstring apBssid)
{
const char *c_apSsid = (*env)->GetStringUTFChars(env, apSsid, 0);
const char *c_apBssid = (*env)->GetStringUTFChars(env, apBssid, 0);
jint ret = UwLogin(c_apSsid, c_apBssid);
(*env)->ReleaseStringUTFChars(env, apSsid, c_apSsid);
(*env)->ReleaseStringUTFChars(env, apBssid, c_apBssid);
return ret;
}
对比jni接口和java中native函数,java类型在c/c++中变为j+java类型。上述代码中jstring转换为char *类型,使用完成后务必要删除掉,防止内存泄露。
现在来讨论c/c++中调用java类的函数。
先贴出几个必须的函数:
C中定义映射的类、方法、对象
jclass TestProvider;
jobject mTestProvider;
jmethodID getTime;
jmethodID sayHello;
C 中映射 类
TestProvider = (*jniEnv)->FindClass(jniEnv,"com/duicky/TestProvider");
C中新建对象
jmethodID construction_id = (*jniEnv)->GetMethodID(jniEnv, TestProvider,"<init>", "()V");
TestProvider mTestProvider = (*jniEnv)->NewObject(jniEnv, TestProvider,construction_id);
C 中映射方法
静态:
getTime = (*jniEnv)->GetStaticMethodID(jniEnv, TestProvider, "getTime","()Ljava/lang/String;");
非静态:
sayHello = (*jniEnv)->GetMethodID(jniEnv, TestProvider, "sayHello","(Ljava/lang/String;)V");
C 中调用 Java的 方法
静态:
(*jniEnv)->CallStaticObjectMethod(jniEnv, TestProvider, getTime);
非静态:
(*jniEnv)->CallVoidMethod(jniEnv, mTestProvider, sayHello,jstrMSG);
jint Java_com_wlan_wifi_UwApi_UwRegCallback(JNIEnv *env, jobject obj,jobject cb)
{
int retGvm=(*env)->GetJavaVM(env,&gs_jvm);
G_UWCb=(jclass)((*env)->NewGlobalRef(env,cb));
G_obj=(jclass)((*env)->NewGlobalRef(env,obj));;
jclass cls = (*env)->GetObjectClass(env,G_UWCb);
methodID_funcCallBack_login = (*env)->GetMethodID(env,cls,"funcCallBack_login","(II)V");
methodID_funcCallBack_logout = (*env)->GetMethodID(env,cls,"funcCallBack_logout","(I)V");
UwRegCallback(&funcCallBack);
}
写道
void funcCallBack_login(int errCode,int natFlag)
{
JNIEnv *env;
int ret=(*gs_jvm)->AttachCurrentThread(gs_jvm,(JNIEnv **)&env, NULL);
if(ret)
{
IMS_MSGLOG(IMS_MESSAGE_ERROR, "funcCallBack_login :Get env failed ret=%d",ret,0,0,0);
return;
}
(*env)->CallVoidMethod(env,G_UWCb,methodID_funcCallBack_login,errCode,natFlag);
}
分享到:
相关推荐
学习JNI编译时,缺少的jni.h和jni_md.h头文件,Java调用C和C++函数时的JNI使用区别: 注意:jni.h头文件中对于***.c & ***.cpp采用不同的定义
Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 Chap 3:javah命令帮助信息... 16 Chap 4:用javah产生一个.h文件... 17 Chap5:jni教程(very very good) 19 Chap6: JNI传递返回值... 26 15.2.2.3 传递字符...
META-INF/MANIFEST.MF com.ice.jni.registry.HexNumberFormat.class com.ice.jni.registry.NoSuchKeyException.class com.ice.jni.registry.NoSuchValueException.class com.ice.jni.registry.RegBinaryValue.class ...
本书介绍了JNI的设计思想,对这种思想的理解是使用JNI的各种特性的基础。 本书有一部分是JAVA2平台上面的JNI特征的规范说明。JNI程序员可以把这部分用作一个手册。JVM开发者在实现虚拟机的时候必须遵守这些规范。 ...
com.ice.jni.registry.RegMultiStringValue.class com.ice.jni.registry.RegBinaryValue.class com.ice.jni.registry.RegistryException.class com.ice.jni.registry.NoSuchValueException.class ...
从网上找的JNI编程指南,但是没有书签,为了方便自己看就添加了书签。JNI 是 JAVA 平台的一个重要特征, 使用它我们可以至用以前用 C/C++写的大量代码。本书 既是一个编程指南也是一个 JNI 手册。本书共包括三部分...
JNI的两个头文件jni.h和jni_md.h,提供需要的人下载!!!!!
上期技术的CTP接口的JNI封装: (1)网上也有一些实现,不过都挂羊头卖狗肉的,超级鄙视。 (2)testCTP是JAVA的Eclipse工程,执行CTPTest就可以调用起CTP的JNI接口,lib是testCTP工程依赖的jar包,熟悉JAVA的人导入这个...
jni.h文件jni.h文件jni.h文件jni.h文件jni.h文件jni.h文件
Java jni调用c实例
3. 在根目录下创建 jni 目录(mkdir jni). 4. 利用命令生成相应的头文件,在根目录下执行:javah -classpath bin/classes -d jni com.xxx.hello.HelloJni ————————————— ——————— ^ ^ 包名 ...
JNI 静态注册 so 和 IDA 导入的 JNI.h 文件
学习JNI编译时,缺少的jni.h和jni_md.h头文件
Android jni基础知识, # This is a test examlpe foe android jni 1、实现一个android工程,在其Android.mk文件中不要定义jni相关的东西,代码中可以尽情的使用 2、使用mmm 命令编译该工程,能够编译成功的。...
目前Java与Dll交互的技术主要有三种:JNI、JAWIN和JACOB,JNI(Java Native Interface)是SUN提供的Java与系统中的原生方法的技术。JACOB(Java-Com Bridge)提供Java程序调用Microsoft的com队形的方法能力,而除了com...
可在jni层返回应用层一个对象数组,包括字符串、整数、小数的成员变量
JNI入门Demo3.0,用于演示JNI中是如何动态注册Native函数。
JNI,全称为Java Native Interface,即Java本地接口,JNI是Java调用Native 语言的一种特性。通过JNI可以使得Java与C/C++机型交互。即可以在Java代码中调用C/C++等语言的代码或者在C/C++代码中调用Java代码。由于JNI...
赠送jar包:zstd-jni-1.4.4-3.jar; 赠送原API文档:zstd-jni-1.4.4-3-javadoc.jar; 赠送源代码:zstd-jni-1.4.4-3-sources.jar; 赠送Maven依赖信息文件:zstd-jni-1.4.4-3.pom; 包含翻译后的API文档:zstd-jni-...
在jni中获取android 设备的mac地址