我就是按照有个论坛eoeandroid论坛上讲JNI的那篇文章,写了TestDel的例子,在VS2005里面New了一个工程选址VC建立win32 project,选中dll建立empty project,将javah生成的头文件添加到此工程。
代码里面就是
JNIEXPORT void JNICALL Java_TestDel_creFolder(JNIEnv*,jclass)
编译也没有错误,但是没有生成dll.但是有一个warning:
1>正在链接...
1>LINK : 没有找到 E:\test\Debug\test.dll 或上一个增量链接没有生成它;正在执行完全链接
1>test.def(1) : warning LNK4017: Java_TestDel_creFolder 语句不支持目标平台;已忽略
这个我还需要像做普通的DLL那样做一个DEF文件,然后写上导出那些函数吗?
那个破资料上也没有说啊。顺便,BS一下网上的资料。
我当时为了生成那个头文件,执行javah命令怎么都不对,不是提示非法的软件包名称就是说找不到类。那些资料就是没有说很重要的一句:要执行set classpath,或者设置环境变量。真是!!!!!!!!!!

解决方案 »

  1.   

    我试验了一下,如果我增加个DEF文件,类似:
    LIBRARY "test"
    EXPORTS
    Java_TestDel_creFolder  @1;
    这样就可以生成DLL,那个资料很多地方说的真是有问题,有些该说的不说,别人只好摸索
      

  2.   

    那个文档上说:把生成的TestDel.dll改名为cjw.dll,(因为java代码里面是,需要保持一致)然后执行Java TestDel
    结果我按照它说的却出现错误:
    D:\Program Files\Java\jdk1.6.0_21\bin>java E:\Project\jni-test\TestDel\src\TestD
    el.class
    Exception in thread "main" java.lang.NoClassDefFoundError: E:\Project\jni-test\T
    estDel\src\TestDel/class
    Caused by: java.lang.ClassNotFoundException: E:\Project\jni-test\TestDel\src\Tes
    tDel.class
            at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
            at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
    Could not find the main class: E:\Project\jni-test\TestDel\src\TestDel.class.  P
    rogram will exit.
    public class TestDel {
    static 
    {
    System.loadLibrary("cjw");
    }
    public native static void creFolder();
    public native static void delFolder1();
    public native static void delFolder2();
    public static void main(String[] args)
    {
    TestDel test = new TestDel();
    System.out.println("start create Folder");
    test.creFolder();
    System.out.println("start create Folder");

    long stime=System.currentTimeMillis();
    test.delFolder1();
    long etime=System.currentTimeMillis();
    System.out.println(etime-stime);


    }}
      

  3.   

    没看懂,为什么在VC下写DLL?jni生成的不是.so吗
    你说的"eoeandroid论坛上讲JNI的那篇文章" 给个链接看看
      

  4.   

     原文在http://www.eoeandroid.com/thread-8312-1-1.html,CSdn上也有下
      

  5.   

    其实现在其他问题都可以先不管,但这个问题却需要解决:D:\Program Files\Java\jdk1.6.0_21\bin>java E:\Project\jni-test\TestDel\src\TestD
    el.class
    Exception in thread "main" java.lang.NoClassDefFoundError: E:\Project\jni-test\T
    estDel\src\TestDel/class
    Caused by: java.lang.ClassNotFoundException: E:\Project\jni-test\TestDel\src\Tes
    tDel.class
      at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
      at java.security.AccessController.doPrivileged(Native Method)
      at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
      at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
      at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
      at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
    Could not find the main class: E:\Project\jni-test\TestDel\src\TestDel.class. P
    rogram will exit.
      

  6.   

    我下载了10期特刊,全部找了一遍,没看到你说的用VC写DLL的方法啊,是你眼花了还是我眼花了-_-
      

  7.   

    就算你能生成DLL,那也不是ARM的啊,怎么能在真机上跑
      

  8.   

    只需要建立一个dll的工程,选择simple project,然后将jni的.h和.cpp都加到工程里,设置vc6的include路径为jdk的include,然后编译就可以了。编译成功后会生成.dll
      

  9.   

    你说的是这个吧 http://singlerwong.spaces.eepw.com.cn/articles/article/item/25111
    这有什么意义呢 DLL的功能还是受jni.h的限制,和HelloJni没有本质区别啊。
      

  10.   

    只需要建立一个dll的工程,选择simple project,然后将jni的.h和.cpp都加到工程里,设置vc6的include路径为jdk的include,然后编译就可以了。编译成功后会生成.dll我编译生成DLL,然后把DLL放在.java和.class目录下,执行命令,提示 Exception in thread "main" java.lang.NoClassDefFoundError
    java E:\Project\jni-test\TestDel\src\TestD
    el.class
      

  11.   

    我下载了10期特刊,全部找了一遍,没看到你说的用VC写DLL的方法啊,是你眼花了还是我眼花了-_-
    就是JNI实现里面,最后一页
      

  12.   

    你要找arm编译器编译linux下的动态库。so
      

  13.   

    android下没有dll,只有so哦。windows下的jni调用dll有很多资料的,兄弟你还是别查android上的jni调用了。
      

  14.   

    android下的so可以直接用ndk编译。
      

  15.   

    也就是说JNI不行,一定要NDK去做so
      

  16.   

    我是要把以前有源代码的DLL,改成so,然后在android里面的应用apk调用。所以我想先把应用通过jni调用dll走通,然后把dll改成so.通过ndk
      

  17.   

    问一下,这个您实现了吗
    我是要把以前有源代码的DLL,改成so,然后在android里面的应用apk调用。所以我想先把应用通过jni调用dll走通,然后把dll改成so.通过ndk
      

  18.   

    你在生成dll文件的时候,把MD改成MT试试