我正在linux(SuSE)上编写一个Java应用程序,它应该使用JNI与本机库进行通信。本机库已使用Android NDK构建。
lib一直使用命令ndk-build
创建。
Android.mk
看起来像这样:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)
Application.mk
就像这样
APP_ABI := x86
APP_STL := system
正在为x86环境构建.so
。
通过System.loadLibrary()
加载此库时,会出现以下错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError.
libhello-jni.so: libstdc++.so: cannot open shared object file: No such file or directory
尝试了许多事情,包括设置APP_STL
。但是错误没有得到解决。
我正在使用ndk-build
,因为最后整件事必须转移到Android,这需要使用ndk创建lib。
答案 0 :(得分:0)
根据你的模块名称LOCAL_MODULE:= hello-jni,你应该使用
的System.loadLibrary(" HELLO-JNI&#34);
答案 1 :(得分:0)
由于多种原因,您无法使用NDK构建库以供在普通Linux上使用,包括C库及其关联的动态链接器不同且库命名约定不同。通常你也会有一个不同的处理器(尽管NDK现在支持开发机器中可能存在的大部分),即使处理器匹配,也可能是一个微妙的不同ABI。
您仍然可以实现在桌面上测试jni代码的目标,您只需要使用针对桌面Linux环境的工具链(使用适当的jni使用设置)来构建它,然后使用NDK为您的Android目标。
答案 2 :(得分:0)
感谢。我能够构建lib(使用gcc),加载它并从java调用CPP接口api(从命令行使用-java myMainClass) 但是当我从eclipse IDE(来自ADT)运行相同的java源代码时,它会给出错误: “ 线程“main”中的异常java.lang.UnsatisfiedLinkError:myMainClass.printLine()Ljava / lang / String; at myMainClass.printLine(Native Method) 在myMainClass.main(myMainClass.java:26) “ 我在IDE中设置了lib路径,如下所示: 属性 - > Java构建路径 - >源标签 - >本机库位置
java源代码如下:
import java.lang.System;
import java.lang.String;
public class myMainClass {
// native functions
public native String printLine();
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("Hello world! in java");
myMainClass m = new myMainClass();
String s1 = m.printLine();
System.out.println(s1);
}
static {
System.loadLibrary("hello");
}
}
CPP来源如下:
#include <stdio.h>
#include <iostream>
#include "myMainClass.h"
JNIEXPORT jstring JNICALL Java_myMainClass_printLine
(JNIEnv *env, jobject object)
{
return env->NewStringUTF("Hello from JNI !");
}