JNI学习

看到一些面试要求都有JNI开发经验,可是工作中一直没遇到,网上JNI的学习资料很多,看似简单,可是真正写起来还是各种问题啊。现在就把学习例子的过程记录下来,用于日后参考。

1.编写java程序

package jnitest;

public class HelloWorld {

//所有native关键词修饰的都是对本地的声明

public native void displayHelloWorld();

static{

System.loadLibrary("helloQQ");//载入本地库

}

public static void main(String[] args) {

new HelloWorld().displayHelloWorld();

}

}

2.编译此程序 

3.生成头文件


注意红色框中的,一定要和步骤中的包名一样,否则会报错

Exception in thread "main" java.lang.UnsatisfiedLinkError: jnitest.HelloWorld.displayHelloWorld()V
at jnitest.HelloWorld.displayHelloWorld(Native Method)
at jnitest.HelloWorld.main(HelloWorld.java:13)

生成的文件jnitest_HelloWorld.h内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */

#include <jni.h>

/* Header for class jnitest_HelloWorld */



#ifndef _Included_jnitest_HelloWorld

#define _Included_jnitest_HelloWorld

#ifdef __cplusplus

extern "C" {

#endif

/*

 * Class:     jnitest_HelloWorld

 * Method:    displayHelloWorld

 * Signature: ()V

 */

JNIEXPORT void JNICALL Java_jnitest_HelloWorld_displayHelloWorld

  (JNIEnv *, jobject);

#ifdef __cplusplus

}

#endif

#endif

4. 编写本地方法实现和由javah命令生成的头文件里面声明的方法名相同的方法

打开VC,新建一个Win32 Dynamic-Link Library 的一个简单的DLL工程,名为:helloQQ。helloQQ.cpp代码如下:

#include "stdafx.h"

#include "jni.h"

#include "jnitest_HelloWorld.h"

BOOL APIENTRY DllMain( HANDLE hModule, 

                       DWORD  ul_reason_for_call, 

                       LPVOID lpReserved

)

{

    return TRUE;

}

JNIEXPORT void JNICALL JNICALL Java_jnitest_HelloWorld_displayHelloWorld(JNIEnv *,jobject)

{

printf("Helloworld!\n");

return;

}

其中JNIEXPORT void JNICALL JNICALL Java_jnitest_HelloWorld_displayHelloWorld(JNIEnv *,jobject)是步骤3生成头文件中的方法实现,此处就打印Helloworld!  要注意的几个地方:

1)修改设置如下:

2)引入的jni.h来自于jdk/bin/include目录,所以要把此文件添加到你的头文件夹下,同时还要引入jdk/bin/include/win32下的jawt_md.h和

jni_md.h。以及步骤3生成的头文件

3)此时如果报步骤3中的头文件中找不到jni.h,则把jni.h、jawt_md.h和jni_md.h复制到VC安装路径的VC98\Include下


jawt_md.h和

jni_md.h

jawt_md.h和

jni_md.h

jawt_md.h和

jni_md.h

5.生成dll文件,ctrl+F7编译,F7组建,即可看到生成的helloQQ.dll

6.执行java文件,如下:

如果报找不到helloQQ ,则将生成的dll 文件放到System.out.println(System.getProperty("java.library.path"))打印出来的路径下,这样就应该没有问题了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android JNI学习路线可以按照以下步骤进行: 1. 了解JNI的基本概念和作用:JNIJava Native Interface)是Java提供的一种机制,用于实现Java与其他编程语言(如C、C++)之间的交互。它允许在Java代码中调用本地代码(Native Code),并且可以在本地代码中调用Java代码。 2. 学习JNI的基本语法和规则:JNI使用一组特定的函数和数据类型来实现Java与本地代码之间的交互。你需要学习如何声明本地方法、如何在Java代码中调用本地方法、如何在本地代码中调用Java方法等。 3. 学习JNI的数据类型映射:JNI提供了一套数据类型映射规则,用于将Java数据类型映射到本地代码中的数据类型。你需要学习如何处理基本数据类型、对象类型、数组类型等。 4. 学习JNI的异常处理:在JNI中,Java代码和本地代码之间的异常处理是非常重要的。你需要学习如何在本地代码中抛出异常、如何在Java代码中捕获异常等。 5. 学习JNI的线程处理:JNI允许在本地代码中创建和操作线程。你需要学习如何创建和销毁线程、如何在线程之间进行通信等。 6. 学习JNI的性能优化:JNI涉及到Java代码和本地代码之间的频繁切换,因此性能优化是非常重要的。你需要学习如何减少JNI调用的次数、如何避免不必要的数据拷贝等。 7. 学习JNI的调试和测试:在开发JNI程序时,调试和测试是非常重要的。你需要学习如何使用调试器调试本地代码、如何进行单元测试等。 8. 学习JNI的进阶主题:一旦掌握了基本的JNI知识,你可以进一步学习JNI的进阶主题,如JNIJava虚拟机的交互、JNI与动态链接库的交互、JNI与多线程的交互等。 总结起来,Android JNI学习路线包括了基本概念、基本语法、数据类型映射、异常处理、线程处理、性能优化、调试和测试以及进阶主题等内容。通过系统地学习这些知识,你将能够更好地理解和应用JNI技术。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值