`

android JNI实验心得

 
阅读更多

编写JNI最好用C++编写,因为比较简单

java类中,可以定义一个跟java函数一模一样的native函数,不会出现冲突。

JNIEXPORT, JNICALL关键字 没必要加,不加也能运行。

静态注册:根据JNI的函数名来注册

注册规则:函数名必须是 "Java_" + 包名 + 类名  + 方法名,"." 符号一律换成“_”。

                 函数的前两个参数必须是(JNIEnv *env, jobject object )

                供java层调用的函数都必须采用"C"的编译方式编译,所以若是采用.cpp文件,即使用C++编写native                 层代码,则要在文件头中适用extern "C" {},在{} 中声明被调用函数

动态注册:动态注册时,函数名没必要按JNI函数名规则来取。

//声明使用"C"的方式编译

          extern "C"

{

  jstring com_lj_nativetest_NativeApi_helloWorld(JNIEnv *env, jobject object);

}

 

jstring com_lj_nativetest_NativeApi_helloWorld(JNIEnv *env, jobject object)

{

jstring hello = env->NewStringUTF("Hello from JNI !");

return hello;

}

 

//这个最好是静态的,因为android的官方文档说:

  • In JNI_OnLoad, register all of your native methods. You should declare the methods "static" so the names don't take up space in the symbol table on the device.

static JNINativeMethod gMethods[] = {

{

"helloWorld",

"()Ljava/lang/String;",

(void*) com_lj_nativetest_NativeApi_helloWorld

 

}

};

 

 

int register_native_methods(JNIEnv *env, const char* className, const JNINativeMethod* gMethods, int numMethods)

{

jclass clazz;

clazz = env->FindClass(className);

 

if (env->RegisterNatives(clazz, gMethods, numMethods) < 0)

{

return JNI_FALSE;

}

return JNI_TRUE;

}

 

jint JNI_Onload(JavaVM* vm, void* reserved)

{

JNIEnv* env;

jint result = -1;

 

if (vm->GetEnv((void**) env, JNI_VERSION_1_6) != JNI_OK)

{

return -1;

}

 

 

if (register_native_methods(env, "com/lj/nativetest/NativeApi", gMethods, sizeof(gMethods) / sizeof(gMethods[0])))

{

goto bail;

}

 

bail:

return result;

 

}

  • 以上动态注册代码在我的机子上会报错,我也不知道为什么, 包名路径什么的都没错,就是找不到。还有我的Eclipse不能识别C++的“NULL”,这是哪里出问题了,有带查证。

JNI 中的string 默认是"Modified UTF-8"编码的, java语言默认是使用“UTF-16”编码的,所以会出现乱码,需要转换编码

分享到:
评论

相关推荐

    android jni获取 Mac地址

    在Android开发中,JNI(Java Native Interface)是一种技术,允许Java代码和其他语言写的代码进行交互。当需要执行一些性能敏感或者Java无法直接处理的任务时,开发者通常会利用JNI调用C/C++原生代码。本话题关注的...

    android jni 加密demo

    在Android开发中,JNI(Java Native Interface)是一个关键的技术,允许Java代码和其他语言写的代码进行交互,通常是C++或C。在这个"android jni 加密demo"中,开发者使用JNI来实现多种加密算法,包括RSA、3DES、AES...

    Android JNI demo

    Android JNI(Java Native Interface)是Android开发中的一个重要概念,它为Java代码提供了与本地C/C++代码交互的能力。JNI在Android应用开发中的作用主要体现在以下几个方面: 1. 性能优化:对于计算密集型任务...

    serial_jni_largestgle_Androidjni_Android串口操作JNI代码_android_

    `serial_jni_largestgle_Androidjni_Android串口操作JNI代码_android_`这个项目就是关于如何使用JNI来实现Android设备的串口读写的示例。 首先,我们需要了解JNI的概念。JNI是Java平台提供的一种接口,允许Java代码...

    Android JNI串口通讯【实战例子】

    Android JNI串口通讯【实战例子】 学习NDK开发很好的例子,也可以直接用在项目中

    android jni 屏幕截图 NativeScreenCapture

    在Android开发中,JNI(Java Native Interface)是一个关键的组件,它允许Java代码与本地(C/C++)代码进行交互。本项目“android jni 屏幕截图 NativeScreenCapture”专注于利用JNI技术来实现Android设备的屏幕截图...

    android jni开发步骤

    Android JNI(Java Native Interface)开发是将C/C++代码集成到Android应用中的技术,它允许开发者利用原生代码实现特定的高性能或低级操作。JNI在Android开发中扮演着重要角色,尤其对于处理图形计算、游戏引擎、底层...

    android jni调用demo

    Android的JNI(Java Native Interface)调用是Android应用开发中的一个重要技术,允许Java代码与本地C/C++代码交互。在Android NDK(Native Development Kit)的帮助下,开发者可以利用C/C++的强大性能处理复杂的...

    Android JNI多线程编程回调JAVA函数

    在Android开发中,JNI(Java Native Interface)是一个关键的技术,它允许Java代码和其他语言写的代码进行交互。JNI在处理性能敏感的任务,如图形渲染、硬件访问或者与C/C++库集成时,尤其有用。本话题将深入探讨如何...

    Android JNI使用demo

    Android JNI(Java Native Interface)是Java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在Android系统中扮演着重要角色,特别是在需要利用C或C++库来提高性能、处理底层硬件操作或者使用现有C/...

    android jni实用demo

    Android JNI(Java Native Interface)是Android系统中连接Java层与C/C++原生代码的关键技术。这个"android jni实用demo"提供了一个很好的学习平台,帮助开发者深入理解如何在Android应用中使用JNI进行跨语言编程。 ...

    Android中JNI实现AES加密源代码

    在Android开发中,JNI(Java Native Interface)是一个关键的技术,它允许Java代码和其他语言写的代码进行交互。JNI常用于提高应用程序性能,访问特定硬件功能,或者像本例中所示,执行安全操作,如AES加密。AES...

    Android JNI 用C函数写本地库读写文件,底层调用小例子

    在Android开发中,JNI(Java Native Interface)是一个关键的技术,它允许Java代码和其他语言写的代码进行交互。这个小例子展示了如何使用JNI和C语言来创建一个本地库,用于执行文件的读写操作,从而实现底层的高效...

    android jni使用curl进行http请求和文件下载

    在Android开发中,JNI(Java Native Interface)是一种技术,允许Java代码和其他编程语言(如C++)进行交互。JNI在很多场景下都很有用,比如优化性能、调用系统底层库或者像本例中那样,利用C/C++库来实现特定功能。...

    android JNI学习三实例

    Android JNI(Java Native Interface)是Android平台上的一个关键特性,它允许Java代码和其他语言写的代码进行交互,通常用于提升性能、调用系统底层库或利用C/C++的库。在这个"android JNI学习三实例"中,我们将...

    android jni 里面使用NewGlobalRef

    在Android的JNI(Java Native Interface)开发中,`NewGlobalRef`是一个至关重要的函数,它允许我们在本地C/C++代码中创建对Java对象的全局引用。这个知识点涉及到Android应用的跨语言交互,内存管理和生命周期管理。 ...

    android jni抛出异常

    在Android开发中,JNI(Java Native Interface)是一个关键的组件,它允许Java代码与其他语言(如C++或C)交互。JNI在许多场景下都非常有用,例如优化性能、调用系统库或者处理特定的硬件功能。然而,如同任何编程...

    android jni 中文字符传递demo

    在Android应用开发中,JNI(Java Native Interface)是一种让Java代码和本地(C/C++)代码交互的技术。本文将深入探讨如何在Android的JNI中处理中文字符传递的问题,这是一个非常实用且重要的技能,特别是在需要高...

    Android JNI之OpenSSL

    《Android JNI之OpenSSL详解》 在Android应用开发中,JNI(Java Native Interface)是一种连接Java和本地代码的桥梁,允许开发者使用C/C++代码来实现高性能或特定平台的功能。OpenSSL是一个强大的安全套接层密码库...

    android JNI C 调用Java

    Android JNI(Java Native Interface)是Android系统提供的一种机制,它允许Java代码调用C/C++原生代码,同时也允许C/C++代码调用Java的方法。JNI在开发高性能、低级硬件交互、使用现有C库或者优化性能的关键部分时...

Global site tag (gtag.js) - Google Analytics