JNI学习,从零开始

昨天突然想到一个问题:Java如何调用动态链接库DLL。然后开始上网查找资料,原来没有接触过这方面,就是小白一个。花了一天时间终于成功,在这里记录一下遇到的问题。

win7 x64   ;vs2010  ;eclipse

 第一步:创建Satrt.java文件代码如下(这里借鉴

使用JNI进行Java与C/C++语言混合编程(1)--在Java中调用C/C++本地库

public class Start {

public native int intMethod(int n);
        public native boolean booleanMethod(boolean bool);
        public native String stringMethod(String text);
  
public static void main(String[] args) {
System.loadLibrary("Start");
        Start sample = new Start();
        int square = sample.intMethod(5);
        boolean bool = sample.booleanMethod(true);
        String text = sample.stringMethod("Java");
  
        System.out.println("intMethod: " + square);
        System.out.println("booleanMethod: " + bool);
        System.out.println("stringMethod: " + text);
}
}

win7下cmd中执行javac Start.java生成Start.class,之后执行javah  Start。出现的问题Javac.exe找不到,Javah时有错误等等。

解决:重装JDK且采用默认路径。我原来是放在D盘下的,环境变量也配置无误,但就是有问题。这里建议采用默认路径。只装JDK即可(JDK中包含的jre也采用默认安装)。因为jdk内包含一个jre文件,所以自定义安装时jdk与jre安装在同一目录下并列,不必另外下载jre单独安装。

生成Start.h时注意在start.h的根目录下执行javah Start;另外Satrt不带.class后缀。

第二步:使用vs2010生成DLL

文件->新建项目->visualC++中选择win32项目;填写项目名Start,后确定->下一步;选择DLL,空项目,完成,新建头文件Start.h,源文件Start.cpp。将上一步生成的Start.h内容拷入。编写Start.cpp。注意:.h与.cpp中需要修改添加下文第三步的包头som

Start.cpp代码如下:

#include "Start.h"
#include <string.h>
 
JNIEXPORT jint JNICALL Java_som_Start_intMethod
  (JNIEnv *env, jobject obj, jint num)
{
    return num * num;
}
 
JNIEXPORT jboolean JNICALL Java_som_Start_booleanMethod
  (JNIEnv *env, jobject obj, jboolean boolean)
{
    return !boolean;
}
 
JNIEXPORT jstring JNICALL Java_som_Start_stringMethod
  (JNIEnv *env, jobject obj, jstring string)
{
    const char* str = env->GetStringUTFChars(string, 0);
    char cap[128];
    strcpy(cap, str);
    env->ReleaseStringUTFChars(string, 0);
    return env->NewStringUTF(strupr(cap));
}

注意:这里需要将jdk安装目录下include文件夹下的jni.h文件与include\win32下的jawt_md.h和jni_md.h拷贝到vs安装目录下的VC\include中。生成->配置管理器,在解决方案配置Release下编译,同时选择64位


启动调试,在项目路径x64\Release下找到Start. dll.

第三步:在eclipse中新建项目som,包名som,类名Start。Start代码如下:

package som;
public class Start {
    public native int intMethod(int n);
    public native boolean booleanMethod(boolean bool);
    public native String stringMethod(String text);
  
public static void main(String[] args) {
System.loadLibrary("Start");
        Start sample = new Start();
        int square = sample.intMethod(5);
        boolean bool = sample.booleanMethod(true);
        String text = sample.stringMethod("Java");
  
        System.out.println("intMethod: " + square);
        System.out.println("booleanMethod: " + bool);
        System.out.println("stringMethod: " + text);
}
}

将Start.dll文件拷贝到Java工程bin目录下;在eclipse环境变量中增加nativelibrary location支持;点击Java项目右键—Build Path—ConfigureBuild Path如




注意:在第一步中的.class文件不可使用eclipse中生成的。因为包含包头时javah有问题,

第四步:编译执行

输出如下:

参考文章:1

JNI调用native方法出现 java.lang.UnsatisfiedLinkError: XXXclass.XXXmethod()异常的解决办法

JNI java.lang.UnsatisfiedLinkError

用Visual Studio2013 express生成64位dll

Eclipse中java项目调用DLL

VS2010如何设置Release

如何用VS2010编写动态链接库DLL

使用JNI进行Java与C/C++语言混合编程(1)--在Java中调用C/C++本地库

Java调用第三方DLL心得

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android JNI学习路线可以按照以下步骤进行: 1. 了解JNI的基本概念和作用:JNI(Java 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的进阶主题,如JNI与Java虚拟机的交互、JNI与动态链接库的交互、JNI与多线程的交互等。 总结起来,Android JNI学习路线包括了基本概念、基本语法、数据类型映射、异常处理、线程处理、性能优化、调试和测试以及进阶主题等内容。通过系统地学习这些知识,你将能够更好地理解和应用JNI技术。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值