我是JNI和Android的新手。我想从本机代码中返回一个字符串值,但它在执行时返回一些随机数。我无法理解我做错了什么。
我的"ndk.c“文件:
int Java_com_example_mayankvijh_test_1app_MainActivity_main(){
return 3;
}
jstring JNICALL Java_com_example_mayankvijh_test_1app_MainActivity_getMessage(JNIEnv *env, jobject thiz) {
return (*env)->NewStringUTF(env,"HELLO");
}
我的MainActivity.java
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try{
System.loadLibrary("wrapper");
}catch(Exception e)
{
e.printStackTrace();
}
System.out.println("main return =" + main());
System.out.println("Hi " + getMessage());
}
public native int main();
public native int getMessage();
我已经成功地加载了库(".so"),我能够返回jint类型并在应用程序中显示,但是jstring正在返回随机数。
我的本机主函数正在返回int,并且正在工作,但是对于我的getMessage()函数,字符串不返回
我的getMessage()输出:
Hi -429916127
我的Application.mk
APP_ABI := armeabi-v7a
APP_PLATFORM := android-9
我的Android.mk
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := wrapper
LOCAL_C_INCLUDES := $(LOCAL_PATH)
LOCAL_SRC_FILES := ndk.c
LOCAL_LDLIBS := -landroid
#--llog -lz
include $(BUILD_SHARED_LIBRARY)
谢谢你的帮助。
发布于 2016-06-24 08:31:31
您有冲突的返回类型:
jstring JNICALL Java_com_example_mayankvijh_test_1app_MainActivity_getMessage(JNIEnv *env, jobject thiz) {
return (*env)->NewStringUTF(env,"HELLO");
}
和
public native int getMessage();
指针,它在作为整数处理的本机代码中返回。您应该将java中的去decaration修正为:
public native String getMessage();
发布于 2016-06-24 06:54:29
Java端:
public class HelloJni extends Activity{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
tv.setText( stringFromJNI() );
setContentView(tv);
}
public native String stringFromJNI();
public native String unimplementedStringFromJNI();
static {
System.loadLibrary("hello-jni");
}
}
本机侧:文件名hello-jni.c
#include <string.h>
#include <jni.h>
/* This is a trivial JNI example where we use a native method
* to return a new VM String. See the corresponding Java source
* file located at:
*
* apps/samples/hello-jni/project/src/com/example/hellojni/HelloJni.java
*/
jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
jobject thiz )
{
#if defined(__arm__)
#if defined(__ARM_ARCH_7A__)
#if defined(__ARM_NEON__)
#if defined(__ARM_PCS_VFP)
#define ABI "armeabi-v7a/NEON (hard-float)"
#else
#define ABI "armeabi-v7a/NEON"
#endif
#else
#if defined(__ARM_PCS_VFP)
#define ABI "armeabi-v7a (hard-float)"
#else
#define ABI "armeabi-v7a"
#endif
#endif
#else
#define ABI "armeabi"
#endif
#elif defined(__i386__)
#define ABI "x86"
#elif defined(__x86_64__)
#define ABI "x86_64"
#elif defined(__mips64) /* mips64el-* toolchain defines __mips__ too */
#define ABI "mips64"
#elif defined(__mips__)
#define ABI "mips"
#elif defined(__aarch64__)
#define ABI "arm64-v8a"
#else
#define ABI "unknown"
#endif
return (*env)->NewStringUTF(env, "Hello from JNI ! Compiled with ABI " ABI ".");
}
更新:
jstring JNICALL Java_com_example_mayankvijh_test_1app_MainActivity_getMessage(JNIEnv *env, jobject thiz) {
return (*env)->NewStringUTF(env,"HELLO");
}
https://stackoverflow.com/questions/38006777
复制相似问题