我现在只想在手机上能够用jni显示helloworld就可以了,我按网上的步骤完成后,在手机上显示时总是死机。
我首先得是一个helloNDKpackage com.example.ndktest;public class helloNDK { /**
 * @param args
 */

static{
System.loadLibrary("NDKtest");
}
public native String sayHello();
}
然后就是生成类文件还有.h文件。然后编写C文件#include "com_example_ndktest_helloNDK.h"
JNIEXPORT jstring JNICALL Java_com_example_ndktest_helloNDK_sayHello  (JNIEnv *env, jobject thiz){ return (*env)->NewStringUTF(env,"Hello,Welcome to NDK");  }
然后就是生成.so文件,在过程中没有报错。生成的是“libNDKtest.so”动态库。
然后是test代码:package com.example.ndktest;import android.app.Activity;
import android.os.Bundle;public class test extends Activity {
/**
 * @param args
 */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
helloNDK obj = new helloNDK();
String str = obj.sayHello();
setTitle("[" + str + "]");
}}
但最后在手机上显示不了,自动关机。求问为什么???
我的java太差,几乎为0,是不是java代码的错啊,但我几乎是照着例子打的。
我重新建了其他几个工程,其结果还是一样的。

解决方案 »

  1.   

      工程是建在NDK的apps下,代码在工程下文件夹project下。android.mk应该没有什么问题。最后只要生成.so的动态库就行了吧。中间的过程没有什么用是不是,不然生不出动态库文件??
      

  2.   

    文件布局为:
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
       android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >    <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" /></RelativeLayout>
    有人发现问题在那儿么??
      

  3.   

    上面helloNDK.java的代码原文:package com.example.ndktest;public class helloNDK { /**
     * @param args
     */

    static{
    System.loadLibrary("helloNDK");
    }
    public native String sayHello();
    }
    其所加载的是helloNDK,例子的出的动态库文件时libhelloNDK.so,而我用make APP=NDKtest -B命令得出却是libNDKtest.so文件,所以在上面的加载我改成了NDKtest。原因是例子给出的命令ndk-build我的上面显示命令not found。我发现好像make APP命令好像也可以生成动态库。但生成的库名就不对了。本应该是libhelloNDK的变成了libNDKtest。我在其他文章中看见好像库名是可以改的,那么库名是不是就不重要。无论什么样子,在加载的时候是什么写什么就可以了。
      

  4.   


    mk文件里面的LOCAL_MODULE项是你编译出来so库的名字
    看代码好像没啥问题
    看你下你的so库放在你的工程哪个目录下的.
      

  5.   


    mk文件里面的LOCAL_MODULE项是你编译出来so库的名字
    看代码好像没啥问题
    看你下你的so库放在你的工程哪个目录下的.
    不是自动生成在lib的文件下吗??
      

  6.   

    其所加载的是helloNDK,例子的出的动态库文件时libhelloNDK.so,而我用make APP=NDKtest -B命令得出却是libNDKtest.so文件,所以在上面的加载我改成了NDKteststatic{
            System.loadLibrary("helloNDK");
        }根据上面2句你提供的信息,你的.mk文件中LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)
    LOCAL_C_INCLUDES := \
    $(LOCAL_PATH)/helloNDK
    LOCAL_MODULE    := helloNDK
    LOCAL_SRC_FILES := \
    helloNDK/helloNDK.cpp
    LOCAL_LDLIBS := -llog
    include $(BUILD_SHARED_LIBRARY)至少应该这样。。
      

  7.   

    你在手机上面运行总是死机,有没有先在模拟器上试试啊?
    你调用jni的*.so库文件生成了吗?
    我的操作步骤是
    1.编写一个工程文件
    2.将工程文件导入ndk的sample文件夹
    3.通过命令上次工程的.h文件
    4.编写.c文件
    5.编写Android.mk文件
    6.ndk-build  看看有没有报错,如果没有报错的话,会提示在指定文件夹下有*.so文件
    7.将*.so文件拷贝出来安装原路径放到libs/armeabi/*.so
    8.在你的activity或者class中,加载库
    9.打印
      

  8.   

    在模拟器上运行了,动态库也生成了。
    1,我是直接在apps下建立一个工程,代码在工程下面的project文件夹下。
    2,命令生成类文件,.h文件。
    3,编写C文件,.mk文件,生成.so文件。
    4,so文件直接生成到lib的指定文件夹下,我就直接运行了。
    现在我想问apps与你说的sample应该是同样的东西。
    生成.so文件可不可以用make APP= 这个命令。
      

  9.   

    额,我觉你说的app文件夹和我说的sample文件夹是一样的,不过我这个是在ndk自带的sample文件夹里面粘贴了我的工程文件,sample里面还有ndk自带的很多其他例子,比如hello-jni这些,我的工程文件是我在xp环境下的eclipse上写的,然后拷贝到ubuntu10.04里面进行如2楼操作的!你说的make APP=这个命令我没见过,根据以前小经验,这个不会执行!
    还有你的Android.mk文件里面的我看到你用的是*.cpp文件,我都是用的C文件!
      

  10.   

    我试了一下可以哦Hellondk.java
    package com.example.hellondk;public class Hellondk { static{
    System.loadLibrary("helloNDK");
    }

    public native String sayHello();

    }MainActivity.javapackage com.example.hellondk;import android.os.Bundle;
    import android.app.Activity;
    import android.util.Log;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.support.v4.app.NavUtils;public class MainActivity extends Activity {    @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            Hellondk obj = new Hellondk();
            Log.d("MainActivity", "------>"+obj.sayHello());
            setTitle(obj.sayHello());
        }    @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.activity_main, menu);
            return true;
        }    
    }com_example_hellondk_Hellondk.cpp#include"com_example_hellondk_Hellondk.h"JNIEXPORT jstring JNICALL Java_com_example_hellondk_Hellondk_sayHello
      (JNIEnv *env, jobject thiz){
    return (*env)->NewStringUTF(env,"Hello,Welcome to NDK");
    }com_example_hellondk_Hellondk.h/* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class com_example_hellondk_Hellondk */#ifndef _Included_com_example_hellondk_Hellondk
    #define _Included_com_example_hellondk_Hellondk
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     com_example_hellondk_Hellondk
     * Method:    sayHello
     * Signature: ()Ljava/lang/String;
     */
    JNIEXPORT jstring JNICALL Java_com_example_hellondk_Hellondk_sayHello
      (JNIEnv *, jobject);#ifdef __cplusplus
    }
    #endif
    #endif
    Android.mkLOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_C_INCLUDES := $(LOCAL_PATH)/
    LOCAL_MODULE    := helloNDKLOCAL_SRC_FILES := com_example_hellondk_Hellondk.c
    LOCAL_LDLIBS := -lloginclude $(BUILD_SHARED_LIBRARY)然后通过ndk-build来编译生成的libhelloNDK.so库放到 android 工程目录下的 libs/armeabi 目录下即可,你说ndk-build命令找不到,是不是你没配置PATH啊,你把ndk的根目录写在PATH环境变量中,就可以了呀。最后祝你成功,哈哈。