按照网上查到的例子试了试。目前可以编译出来.so文件。
用adb push传到了/system/lib下面。但是在Activity的onCreate里面
System.loadLibrary时报错:java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1479]:    33 unknown reloc type     8 @      (    0)不知道原因是什么。
我用的emulator和Eclipse来开发。emulator是2.3。编译.so是用的2.3.1的source code.
native C的source code在$HOME/development/jni
编译时使用make libjnitest是不是我需要使用什么选项之类的东西?
哪位高手指点一下??谢谢!

解决方案 »

  1.   

    jni中叶打印一些trace吧如果编译的jni so文件没问题,那就是 c和java的方法不匹配
      

  2.   

    LS说的对,在你jni的函数里打log,用这个函数,和printf一样,能在eclipse中的logcat显示log信息。
    __android_log_print(int prio, const char *tag, const char *fmt, ...)
      

  3.   

    你试试ndk里自带的hello-jni有没有问题
      

  4.   

    我把.c文件里面的和LOG有关的东西都删了,现在可以loadLibrary成功了。to dinjay:
    我没有用ndk。但是调用JNI的native函数还是有错。我再调调看看。
      

  5.   

    在调用JNI的method时,仍然是这个错误:
    java.lang.UnsatisfiedLinkError: GetTest奇怪啊!
      

  6.   

    是root么 以前我也遇到过 换root就好了
      

  7.   


    还需要对编译.so的Makefile 进行修改。  现在找不到正确的库文件
      

  8.   

    yiyaaixuexi:
    在emulator中怎么改成root?还有:修改Makefile?就是Android.mk吗?为什么?还有个信息:我nm了一下.so文件。函数名是:
    Java_com_xxx_JniTest_JniTestMain_GetTest这个没有问题把?
      

  9.   

    jni实现里,最后有没有把对应的GetTest函数加到
    JNI_OnLoad里?不加是用不了的。Android.mk不用吧,你贴出来看看,如果错了是没法生成so的。so里也不会有Java_com_xxx_JniTest_JniTestMain_GetTest
      

  10.   

    需要在JNI_OnLoad里面手动注册GetTest函数吗?
    我试试。
      

  11.   

    我又试了一下,还是在System.loadLibrary时出错:java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1479]: 33 unknown reloc type 8 @ ( 0)我把我的详细的步骤再列一下:
    1. 在eclipse里面建立一个Android project。
    有一个Activity.然后加入代码:
    static {
         try {
            System.loadLibrary("jnitest");
           
         } catch(Exception e) {
         e.printStackTrace(System.out);
         }
    }
    public native String GetTest();
    2。 编译一下它。
    3。 用javah -classpath bin -d jni com.xxx.JniTest.JniTestMain生成.h文件
    4。 再自己写一个.c文件:
    #include "com_xxx_JniTest_JniTestMain.h"#define LOG_TAG "JNITest" 
    #undef LOG #include <utils/Log.h> JNIEXPORT jstring JNICALL Java_com_xxx_JniTest_JniTestMain_GetTest 
      (JNIEnv * env, jobject obj) 

        return (*env)->NewStringUTF(env, (char *)"JNITest Native String"); 
        LOGD("Hello LIB!\n"); 

    5。 然后在Ubuntu10.4里面,在Android 2.3的source code中
    把.c,.h和Android.mk放在{Android_home}/developement/jni里面Android.mk:
    LOCAL_PATH:= $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_SRC_FILES:= \
        com_xxx_JniTest_JniTestMain.c
    LOCAL_C_INCLUDES := \
        $(JNI_H_INCLUDE)
    LOCAL_SHARED_LIBRARIES := libutils 
    LOCAL_PRELINK_MODULE := false
    LOCAL_MODULE := libjnitest
    LOCAL_MODULE_TAGS := optional
    include $(BUILD_SHARED_LIBRARY)6。 然后在Android_home目录下make libjnitest
    生成了.so文件在out/...下面。
    7。 把.so文件copy到windows机器上。然后用:
    adb remount
    adb push xxx.so /system/lib
    8。 在eclipse中运行我的project
    到System.loadLibrary("jnitest");
    出错。此外,我还试了使用emulator的1.6版本。出错结果稍有区别:
    java.lang.UnsatisfiedLinkError: Cannot found jnitest library.各位高手,请问我的哪一步可能有问题,给些提示吧。谢谢谢!~
      

  12.   

    看下load library的代码吧:1.6的    void loadLibrary(String libname, ClassLoader loader) {
            String filename;
            int i;        if (loader != null) {
                filename = loader.findLibrary(libname);
                if (filename != null && nativeLoad(filename, loader))
                    return;
                // else fall through to exception
            } else {
                filename = System.mapLibraryName(libname);
                for (i = 0; i < mLibPaths.length; i++) {
                    if (false)
                        System.out.println("Trying " + mLibPaths[i] + filename);
                    if (nativeLoad(mLibPaths[i] + filename, loader))
                        return;
                }
            }        throw new UnsatisfiedLinkError("Library " + libname + " not found");
        }
    很明显就是 nativeLoad 失败了。
    这里很可能的原因就是:1. 文件不存在
    2。 文件格式不正确这还没到加载java方法的那步就错了。仔细检查下吧
      

  13.   

    freshui:
    谢谢!你说的很对。我看了一下2.3的source code,应该是nativeLoad出错了。
    1。文件不存在,我确定它已经被放在/system/lib下面了。而且Android的LD_LIBRARY_PATH也是这个路径。这个原因我觉得可以排除。
    2。文件格式不正确。
    我觉得这个可能性比较大。但是为什么不正确呢?我在development/xxx/下面用Android.mk来编译.so文件的方法不正确吗?
    你们都是怎么生成.so文件的?能告诉我一下吗?谢谢!
      

  14.   


    额,有种更简单的 开发环境 建议你搭建。   Eclipse + Cygwin + CDT  + NDK 我在这环境下开发NDK 会自动生成so文件 , 并将so 放到指定位置 。 并且如果 JNI 下的文件有语法错误也会给出提示 。 用起来很爽 。 http://www.cnblogs.com/luxiaofeng54/archive/2011/02/12/1952391.html
      

  15.   

    再问一个问题:
    我是在SDK带的emulator上跑应用。所以我是否应该使用ARM的交叉编译工具编译我的.so?我在android source code中直接make生成的.so文件在:
    out/target/product/generic_x86/system/lib请问是否在make之前需要设置什么东西?或者我需要安装交叉编译工具来编译生成.so?
      

  16.   

    我可能找到问题了。
    我用的source code是for x86的。我需要用for ARM的。正在下载,等下载完了再试试。
      

  17.   

    我用Android for ARM的source code编译了一下.so,OK了。
    谢谢大家!结贴。
      

  18.   

    搂住, 我想问  什么 是 android for ARM source code 编译?有这个版本?
     我也出现了你这个问题。帮忙告诉下。
      

  19.   

    android for ARM source code就是:Android对ARM和x86有不同的版本。
    我用的emulator,当然是ARM的平台了。所以应该用Android for ARM的source code来编译,这样才能生成ARM平台的binary文件。
      

  20.   

    请问能具体说明以下吗?哪里能找到android for ARM source code,我再网站上
    http://developer.android.com/sdk/index.html
    只看到对x86的阿,麻烦你帮帮忙很急的!
      

  21.   

    给LZ推荐一个JNI的使用,有源码和大量注释,LZ一定要试下:
    http://download.csdn.net/detail/txzsp/2285294