为什么在使用ndk-build时只能计算int作为回报



我正试图在aar中使用jni来制作一个项目。然而,简单的int计算似乎可以在cpp部分返回,但我不知道为什么在尝试使用if语句时会出现错误。

最后,我想在cpp中执行http通信,解析html并返回结果。

这是为了在制作aar时使重构变得困难。

很抱歉我的英语不好。

这是我的代码

package kr.go.murldc2;
import android.content.Context;
import android.util.Log;
import android.widget.Toast;
public class murldc2 {
static {
System.loadLibrary("helloNdk");
}
public native String print_ndk(String text);
public native int add_ndk(int a, int b);
public void showToast(Context context, String s){
String printss = print_ndk(s);
int sum = add_ndk(1,2);
System.out.println(sum);
Toast.makeText(context,printss,Toast.LENGTH_LONG).show();
}
}

android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := helloNdk
FILES := hello_ndk.cpp
LOCAL_SRC_FILES := $(FILES)
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)

//

// Created by flsor on 2022-10-06.
//
#include <jni.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include<kr_go_murldc2_murldc2.h>
JNIEXPORT jstring JNICALL Java_kr_go_murldc2_murldc2_print_1ndk
(JNIEnv *env, jobject thiz, jstring text) {
jstring str = (jstring) "stri";
if(text != str){
return (jstring)"notsame";
}
return text;
}
JNIEXPORT jint JNICALL Java_kr_go_murldc2_murldc2_add_1ndk
(JNIEnv *env, jobject thiz, jint a,jint b) {
return a+b+3;
}

这是我的错误:

E/kr.go.kootest2: JNI ERROR (app bug): accessed stale Local 0xc09443b5 (index 201933883 in a table of size 6) A/kr.go.kootest2: java_vm_ext.cc:577] JNI DETECTED ERROR IN APPLICATION: use of deleted local reference 0xc09443b5 java_vm_ext.cc:577] from java.lang.String kr.go.murldc2.murldc2.print_ndk(java.lang.String) A/kr.go.kootest2: runtime.cc:655] Runtime aborting... runtime.cc:655] Dumping all threads without mutator lock held runtime.cc:655] All threads: runtime.cc:655] DALVIK THREADS (21):

jstring是对java.lang.String对象的(本地或全局(引用。不能简单地将const char *强制转换为jstring并期望它工作。

使用jstrings的工具如下:

  • env->NewStringUTF:这将使用修改后的UTF-8编码从本地const char *构建Java字符串
  • env->GetStringUTFChars:这将(可能(获取String内容的副本,并为副本提供char *。之后您需要致电env->ReleaseStringUTFChars
  • 您可以使用标准的GetMethodID/Call<Type>Method函数调用java.lang.String的方法

最新更新