`

jni

 
阅读更多

android通过jni实现java与c/c++之间的交互。

jni主要分成2个部分使用:

  1. java代码调用c/c++的代码;
  2. c/c++调用java的对象函数;

先来讨论 ava代码调用c/c++的代码。java部分需要完成两个工作:

  1. 加载c/c++的动态库函数;
  2. 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.zip jni编译jni下载

    学习JNI编译时,缺少的jni.h和jni_md.h头文件,Java调用C和C++函数时的JNI使用区别: 注意:jni.h头文件中对于***.c & ***.cpp采用不同的定义

    JNI完全技术手册 带完整书签

    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 传递字符...

    java读写注册表jar包,com.ice.jni.registry

    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的设计思想,对这种思想的理解是使用JNI的各种特性的基础。 本书有一部分是JAVA2平台上面的JNI特征的规范说明。JNI程序员可以把这部分用作一个手册。JVM开发者在实现虚拟机的时候必须遵守这些规范。 ...

    Java registry,com.ice.jni.registry

    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编程指南,但是没有书签,为了方便自己看就添加了书签。JNI 是 JAVA 平台的一个重要特征, 使用它我们可以至用以前用 C/C++写的大量代码。本书 既是一个编程指南也是一个 JNI 手册。本书共包括三部分...

    JNI的两个头文件jni.h和jni_md.h

    JNI的两个头文件jni.h和jni_md.h,提供需要的人下载!!!!!

    CTP的JNI封装

    上期技术的CTP接口的JNI封装: (1)网上也有一些实现,不过都挂羊头卖狗肉的,超级鄙视。 (2)testCTP是JAVA的Eclipse工程,执行CTPTest就可以调用起CTP的JNI接口,lib是testCTP工程依赖的jar包,熟悉JAVA的人导入这个...

    jni.h文件.7z

    jni.h文件jni.h文件jni.h文件jni.h文件jni.h文件jni.h文件

    Java jni调用c实例

    Java jni调用c实例

    JNI之Hello-JNI进阶

    3. 在根目录下创建 jni 目录(mkdir jni). 4. 利用命令生成相应的头文件,在根目录下执行:javah -classpath bin/classes -d jni com.xxx.hello.HelloJni ————————————— ——————— ^ ^ 包名 ...

    JNI 静态注册 so 和 IDA 导入的 JNI.h 文件.zip

    JNI 静态注册 so 和 IDA 导入的 JNI.h 文件

    jni.h头文件

    学习JNI编译时,缺少的jni.h和jni_md.h头文件

    jni-example.zip

    Android jni基础知识, # This is a test examlpe foe android jni 1、实现一个android工程,在其Android.mk文件中不要定义jni相关的东西,代码中可以尽情的使用 2、使用mmm 命令编译该工程,能够编译成功的。...

    android_JNI介绍

    目前Java与Dll交互的技术主要有三种:JNI、JAWIN和JACOB,JNI(Java Native Interface)是SUN提供的Java与系统中的原生方法的技术。JACOB(Java-Com Bridge)提供Java程序调用Microsoft的com队形的方法能力,而除了com...

    jni传递对象数组

    可在jni层返回应用层一个对象数组,包括字符串、整数、小数的成员变量

    JNI入门Demo3.0

    JNI入门Demo3.0,用于演示JNI中是如何动态注册Native函数。

    JNI使用规范详解.pdf

    JNI,全称为Java Native Interface,即Java本地接口,JNI是Java调用Native 语言的一种特性。通过JNI可以使得Java与C/C++机型交互。即可以在Java代码中调用C/C++等语言的代码或者在C/C++代码中调用Java代码。由于JNI...

    zstd-jni-1.4.4-3-API文档-中英对照版.zip

    赠送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-...

    android jni获取 Mac地址

    在jni中获取android 设备的mac地址

Global site tag (gtag.js) - Google Analytics