首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

android JNI的有关问题

2013-07-04 
android JNI的问题我现在只想在手机上能够用jni显示helloworld就可以了,我按网上的步骤完成后,在手机上显

android JNI的问题
   我现在只想在手机上能够用jni显示helloworld就可以了,我按网上的步骤完成后,在手机上显示时总是死机。
我首先得是一个helloNDK

package 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代码的错啊,但我几乎是照着例子打的。
我重新建了其他几个工程,其结果还是一样的。
[解决办法]
引用:
上面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。我在其他文章中看见好像库名是可以改的,那么库名是不是就不重要。无论什么样子,在加载的时候是什么写什么就可以了。


mk文件里面的LOCAL_MODULE项是你编译出来so库的名字
看代码好像没啥问题
看你下你的so库放在你的工程哪个目录下的.
[解决办法]
其所加载的是helloNDK,例子的出的动态库文件时libhelloNDK.so,而我用make APP=NDKtest -B命令得出却是libNDKtest.so文件,所以在上面的加载我改成了NDKtest

static{
        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)

至少应该这样。。
[解决办法]
我试了一下可以哦

Hellondk.java


package com.example.hellondk;

public class Hellondk {

static{
System.loadLibrary("helloNDK");


}

public native String sayHello();

}



MainActivity.java

package 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.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_C_INCLUDES := $(LOCAL_PATH)/


LOCAL_MODULE    := helloNDK

LOCAL_SRC_FILES := com_example_hellondk_Hellondk.c


LOCAL_LDLIBS := -llog

include $(BUILD_SHARED_LIBRARY)



然后通过ndk-build来编译生成的libhelloNDK.so库放到 android 工程目录下的 libs/armeabi 目录下即可,你说ndk-build命令找不到,是不是你没配置PATH啊,你把ndk的根目录写在PATH环境变量中,就可以了呀。最后祝你成功,哈哈。

热点排行