MALOUDA-PSA 2024-03-10 17:36 采纳率: 90.1%
浏览 2
已结题

关于上一个问题jni的问题2

接上一个问题 [https://ask.csdn.net/questions/8071363](Could not find or load main class)

package com.example;

public class FastjsonJNI {
    public FastjsonJNI() {
        super();
    }

    private native int add(int a, int b);

    static {
        System.loadLibrary("fastjson_jni");
        //libfastjson_jni
    };


public static void main(String args[]){
    int ret = 0;
    FastjsonJNI fastjsonJNI = new FastjsonJNI();
    ret = fastjsonJNI.add(23, 44);
    System.out.println("hello world! " + ret + "\n");
}
}


//编译:
   javah -jni com.example.FastjsonJNI   //生成 .h 头文件
   javac -d build/ com/example/FastjsonJNI.java   //生成.class文件

//运行出错:
Exception in thread "main" java.lang.UnsatisfiedLinkError: com.example.FastjsonJNI.add(II)I
    at com.example.FastjsonJNI.add(Native Method)
    at com.example.FastjsonJNI.main(FastjsonJNI.java:23)
:
 ret = fastjsonJNI.add(23, 44);
  • 写回答

3条回答 默认 最新

  • Kwan的解忧杂货铺 Java领域优质创作者 2024-03-10 17:36
    关注

    MALOUDA-PSA 下午好🌅🌅🌅
    本答案参考ChatGPT-3.5

    问题描述: 在运行上一个问题中的代码时,出现了以下错误信息:

    Exception in thread "main" java.lang.UnsatisfiedLinkError: com.example.FastjsonJNI.add(II)I
        at com.example.FastjsonJNI.add(Native Method)
        at com.example.FastjsonJNI.main(FastjsonJNI.java:23)
    

    这个错误是在调用native方法add时发生的。

    解决方案:

    1. 检查是否正确加载了native库。上一个问题中使用System.loadLibrary("fastjson_jni");语句来加载native库,确保fastjson_jni库已经正确编译并位于正确的位置。可以使用System.getProperty("java.library.path")来打印当前的库路径。

    2. 确保native方法的签名正确。根据错误信息java.lang.UnsatisfiedLinkError: com.example.FastjsonJNI.add(II)I,可以看到native方法add的签名应该是add(II)I,即两个整型参数,返回一个整型结果。确认在生成头文件时,JNI方法签名是否正确,并且在C/C++实现中是否正确实现了该方法。

    修改后的代码:

    package com.example;
    
    public class FastjsonJNI {
        public FastjsonJNI() {
            super();
        }
    
        private native int add(int a, int b);
    
        static {
            System.loadLibrary("fastjson_jni");
        }
    
        public static void main(String args[]){
            int ret = 0;
            FastjsonJNI fastjsonJNI = new FastjsonJNI();
            ret = fastjsonJNI.add(23, 44);
            System.out.println("hello world! " + ret + "\n");
        }
    }
    

    考虑到上一个问题中关于native方法的声明是正确的,我们重点查看native方法的实现。

    #include <jni.h>
    #include "com_example_FastjsonJNI.h"
    
    JNIEXPORT jint JNICALL Java_com_example_FastjsonJNI_add(JNIEnv *env, jobject obj, jint a, jint b) {
        return a + b;
    }
    

    请注意头文件com_example_FastjsonJNI.h的内容应与native方法的声明相匹配。

    希望这些信息对你有帮助。如果仍然遇到问题,请提供更多的详细信息。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月18日
  • 已采纳回答 3月10日
  • 创建了问题 3月10日

悬赏问题

  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改